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]