Ciao Bart,

Il 25/11/2010 16:33, Bart Aimar ha scritto:
Come da oggetto, ma con la precisazione: SOLO la sheet attiva!

Non mi è chiaro perché, ma pare difficile ottenere quel risultato.

Ho provato registrando (con il registratore standard) i seguenti passi:
Menu file > Esporta nel formato PDF > Spunta su "Selezione" ...
Il risultato (il file pdf) perfetto! Sul file generato solo la tabella
attiva.
Ripetendo la macro registrata si ottiene un pdf dentro tutte le sheet.

Ho ripetuto l'operazione usando il DispatchToApiRecorder-20060707.uno.pkg
di Paolo Mantovani (e che spero legga ancora questa lista),

presente.



ma il codice ottenuto genera un errore BASIC: Parentheses do not match
alla terzultima riga...

Array("Selection", 0, pyuno object
(com.sun.star.uno.XInterface)0x5da2f70{im.....

e non capendo bene quella riga, andando solo per tentativi, non sono
riuscito a sistemarlo.
Non a caso quella riga è quella utile ai fini in oggetto :-(

La riga si può correggere togliendo tutto lo sbrodolamento del debugger e si ottiene questo:

Array("Selection", 0, , com.sun.star.beans.PropertyState.DIRECT_VALUE))

Il problema è che viene ancora esportato l'intero documento.



Cercando in rete ho trovato una macro funzionante che stampa (invia a
stampante) solo la sheet attiva
(http://user.services.openoffice.org/en/forum/viewtopic.php?f=25&t=10179#p48586
)
ma non sono riuscito a modificarla per uscire direttamente in pdf,
cioè ad applicare il metodo .storetoUrl

Pitonyak riporta un workaround, che prevede la cancellazione di TUTTE le
printareas del documento,
ma è un'operazione macchinosa, perché poi bisogna ovviamente
ripristinarle...
Insomma, il posto dove memorizzare le aree di stampa è quello, e mi pare
assurdo si debba "distruggere" quelle informazioni per poterne stampare
un pezzetto.
E così ad occhio mi sembra si faccia prima ad esportare (previo
consolidamento) il foglio da stampare fuori da l documento.
Ma in ogni caso, registrare una printareas non mi sembra così semplice.

In rete ho trovato anche questa soluzione:
http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=25535

basata anche questa sulla modifica delle printareas.

Va detto che l'esportazione basata su printareas è l'esatto contrario dell'esportazione di un range selezionato, quindi mi pare un sistema un po contraddittorio.


In ogni modo, è molto probabile che il codice interno dell'esportazione in PDF, quando trova il parametro "selezione" crei al volo la printarea, faccia l'esportazione e distrugga la printarea.

La cosa si potrebbe replicare in modo relativamente semplice volendo, e a questo punto non avremmo più bisogno del parametro "selection", L'api permette di controllare in modo totale le printareas, tuttavia prima di passare ad una soluzione del genere vorrei essere certo che la "via maestra" non sia percorribile.


Rivediamo un attimo il codice registrato:

Come vedi sia con il mio registratore che con quello ufficiale, i parametri di esportazione sono una lunga lista di array
ogni array contiene un parametro.

Questa cosa degli array è uno stratagemma per evitare di dover dimensionare delle variabili PropertyValue

Cioè, chi ha fatto il registratore lo ha programato per poter masticare sia un oggetto propertyValue che un Array di 4 parametri.

Questi contorcimenti derivano dalla ben nota ossessione germanica per le specifiche (spezifikationen ja?!!!)

comunque, non divaghiamo.
Dalla stessa ossessione derivano ulteriori due problemi:

1)
il parametro selection è (dovrebbe essere) costituito da un oggetto range.
Il macro recorder di ooo non è in grado di tradurre questi parametri in codice basic, perciò la riga viene scritta così:
Array("Selection", 0, , com.sun.star.beans.PropertyState.DIRECT_VALUE))

Come vedi ci sono due virgole senza nulla in mezzo.
Li ci andrebbe la selection ovvero:

Array("Selection", 0, ThisComponent.CurrentSelection, com.sun.star.beans.PropertyState.DIRECT_VALUE))


Il mio registratore tenta in effetti di mettere quel parametro ma nel farlo si sbrodola di brutto e scrive tutto quel papiro di errore.

Il registratore ufficiale invece non tenta nemmeno di mettere il valore e lascia il buco vuoto tra le due virgole.

A questo punto potremmo tentare di aggiungerlo manualmente, ma ti posso già dire che non funzica.

Il motivo potrebbe essere lo stesso: e qui siamo al secondo problema:

2) dato che il registratore non scrive parametri oggetto nel codice generato, non li "legge" nemmeno in fase di esecuzione.



Qualche buona idea ?

Ovviamente, :-) ma prima non potevo esimermi dal triturarti i maroni con una pedante und prolissa und irritante spiegazione tecnica.

La prima idea è guardare la docu ufficiale:
http://wiki.services.openoffice.org/wiki/API/Tutorials/PDF_export

Applicando la documentazione si ottiene il seguente codice:

REM  *****  BASIC  *****

sub test

  'prepara il range da esportare:
  oRng = ThisComponent.Sheets.Foglio1.getCellRangeByName("A15:B17")

  'configurazione del filtro (viene usata più sotto)
  Dim mFilterData(0) As New com.sun.star.beans.PropertyValue
  mFilterData(0).Name = "Selection"
  mFilterData(0).Value = oRng

  'parametri di esportazione
  Dim mStoreOpts(2) As New com.sun.star.beans.PropertyValue
  mStoreOpts(0).Name = "Overwrite"
  mStoreOpts(0).Value = True
  mStoreOpts(1).Name = "FilterName"
  mStoreOpts(1).Value = "calc_pdf_Export"
  mStoreOpts(2).Name = "FilterData"
  mStoreOpts(2).Value = mFilterData()


  sUrl = "file:///home/paolo/Scrivania/test.pdf"
  ThisComponent.storeToURL(sURL, mStoreOpts())

end sub


Nelle mie prove il codice ha funzionato senza intoppi.
Con questa impostazione, oltre a ridurre la gran massa del codice si evita di pastrocchiare con le printareas


ciao
Paolo.






---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Rispondere a