Alaska Software Inc. - EXCEL
Username: Password:
AuthorTopic: EXCEL
Solving EXCEL
on Thu, 04 Feb 2016 20:04:35 +0100
Salve
Mi capita che creando un file Excel con Activex da Alaska
Quando lo apro con excel ho il cursore che gira all'infinito
e non riesco ad eseguire nessuna operazione
se non di chiuderlo da task manager.

Per usarlo correttamente devo aprire le propieta' del
file generato e mettere nella voce Protezione - Controllo
completo su Everyone.

Info ?

Grazie
Solving Re: EXCEL
on Tue, 09 Feb 2016 13:01:08 +0100
Il 04/02/2016 20.04, Solving ha scritto:
> Salve
> Mi capita che creando un file Excel con Activex da Alaska
> Quando lo apro con excel ho il cursore che gira all'infinito
> e non riesco ad eseguire nessuna operazione
> se non di chiuderlo da task manager.
>
> Per usarlo correttamente devo aprire le propieta' del
> file generato e mettere nella voce Protezione - Controllo
> completo su Everyone.
>
> Info ?
>
> Grazie
Ecco il mio sorgente con varie prove
Dunque se l'eseguibile ( il mio exe ) e' ancora
Aperto ho il problema su esposto
se chiudo l'eseguibile il file excel viene aperto senza problemi

cFile := "PROVA.XLS"
nRow := 0

FERASE( cFile )

oExcel := CreateObject("Excel.Application")

IF Empty( oExcel )
ALERT( "Excel NON e' installato! ")
ELSE

* ensure the Excel application is visible.
oExcel:DisplayAlerts := .F.
oExcel:visible := .F.
oExcel:Application:Interactive := .F.
oBook := oExcel:Workbooks:Add()

* --- lascio solo il primo foglio
DO WHILE oBook:Sheets():Count() > 1
oBook:sheets(2):delete()
ENDDO

oSheet := oBook:ActiveSheet
oSheet:PageSetup:Orientation := xlLandscape

PIPPO->( DBGOTOP() )
DO WHILE !PIPPO->( EOF() )
nRow ++
oSheet:Cells(nRow,1):Value := PIPPO->CAMPO1
oSheet:Cells(nRow,2):Value := PIPPO->CAMPO2

ETC...

oSheet:Columns:AutoFit()

PIPPO->( DBSKIP() )
ENDDO

oBook:SaveAs( cFile, xlWorkbookNormal )
oBook:Close()

oSheet:Destroy()
oSheet := NIL -> inserito perche' letto sui forum

oBook:Destroy()
oBook := NIL -> inserito perche' letto sui forum

ENDIF

oExcel:Quit()

SLEEP(300) -> inserito perche' letto sui forum

oExcel:Destroy()
oExcel := NIL -> inserito perche' letto sui forum

RETURN NIL
Solving Re: EXCEL
on Fri, 12 Feb 2016 18:24:32 +0100
Il 04/02/2016 20.04, Solving ha scritto:
> Salve
> Mi capita che creando un file Excel con Activex da Alaska
> Quando lo apro con excel ho il cursore che gira all'infinito
> e non riesco ad eseguire nessuna operazione
> se non di chiuderlo da task manager.
>
> Per usarlo correttamente devo aprire le propieta' del
> file generato e mettere nella voce Protezione - Controllo
> completo su Everyone.
>
> Info ?
>
> Grazie


Per adesso con inserita la seguente riga alla fine.

dopo oExcel:Destroy()

  RunShell("/C TaskKill /F /IM EXCEL.EXE /T")

Sembra funzionare
Claudio DriussiRe: EXCEL
on Wed, 04 May 2016 17:51:18 +0200
Il 12/02/2016 18:24, Solving ha scritto:

>> Mi capita che creando un file Excel con Activex da Alaska
>> Quando lo apro con excel ho il cursore che gira all'infinito
>> e non riesco ad eseguire nessuna operazione
>> se non di chiuderlo da task manager.
>>
>> Per usarlo correttamente devo aprire le propieta' del
>> file generato e mettere nella voce Protezione - Controllo
>> completo su Everyone.

>
> Per adesso con inserita la seguente riga alla fine.
>
> dopo oExcel:Destroy()
>
>   RunShell("/C TaskKill /F /IM EXCEL.EXE /T")
>
> Sembra funzionare

Questo sembra forzare la chiusura del task excel,
secondo me ha il difetto che se tu hai una finestra
excel aperta per altri motivi ti chiude anche quella
o almeno credo perché non ho provato.

Secondo me dovresti cercare tra le impostazioni
globali di excel e concedere il controllo completo
a everyone da li.

Hai altri utenti che usano la tua applicazione?
A loro cosa succede?

Io faccio molta automazione Excel e questo problema
non l'ho mai avuto e i tuoi sorgenti non sembrano avere
niente di particolare.

Ciao
Claudio
Solving Re: EXCEL
on Wed, 04 May 2016 17:58:36 +0200
Il 04/05/2016 17.51, Claudio Driussi ha scritto:
> Il 12/02/2016 18:24, Solving ha scritto:
>
>>> Mi capita che creando un file Excel con Activex da Alaska
>>> Quando lo apro con excel ho il cursore che gira all'infinito
>>> e non riesco ad eseguire nessuna operazione
>>> se non di chiuderlo da task manager.
>>>
>>> Per usarlo correttamente devo aprire le propieta' del
>>> file generato e mettere nella voce Protezione - Controllo
>>> completo su Everyone.
>
>>
>> Per adesso con inserita la seguente riga alla fine.
>>
>> dopo oExcel:Destroy()
>>
>>   RunShell("/C TaskKill /F /IM EXCEL.EXE /T")
>>
>> Sembra funzionare
>
> Questo sembra forzare la chiusura del task excel,
> secondo me ha il difetto che se tu hai una finestra
> excel aperta per altri motivi ti chiude anche quella
> o almeno credo perché non ho provato.
>
> Secondo me dovresti cercare tra le impostazioni
> globali di excel e concedere il controllo completo
> a everyone da li.
>
> Hai altri utenti che usano la tua applicazione?
> A loro cosa succede?
>
> Io faccio molta automazione Excel e questo problema
> non l'ho mai avuto e i tuoi sorgenti non sembrano avere
> niente di particolare.
>
> Ciao
> Claudio
>
>

Ho notato che succede a quei clienti che sono passati da office 97 ( 
vecchio ) a office 2010, 13, etc..
Anzi, no so' per quale motivo alcuni che hanno Office 2007 funzionava
dopo ( forse qualche update di SP su Office ) non ha piu' funzionato.

Excel lo uso poco ( i miei clienti lo usano molto )
quindi non so' di impostazioni, mi puoi spiegare meglio ?.

Grazie
Ciao.

P.S. sembrava morto questo forum )    eppur si scrive 
Claudio DriussiRe: EXCEL
on Fri, 13 May 2016 10:26:24 +0200
Il 04/05/2016 17:58, Solving ha scritto:
> Il 04/05/2016 17.51, Claudio Driussi ha scritto:
>> Il 12/02/2016 18:24, Solving ha scritto:
>>
>>>> Mi capita che creando un file Excel con Activex da Alaska
>>>> Quando lo apro con excel ho il cursore che gira all'infinito
>>>> e non riesco ad eseguire nessuna operazione
>>>> se non di chiuderlo da task manager.
>>>>
>>>> Per usarlo correttamente devo aprire le propieta' del
>>>> file generato e mettere nella voce Protezione - Controllo
>>>> completo su Everyone.
>>
>>>
>>> Per adesso con inserita la seguente riga alla fine.
>>>
>>> dopo oExcel:Destroy()
>>>
>>>   RunShell("/C TaskKill /F /IM EXCEL.EXE /T")
>>>
>>> Sembra funzionare
>>
>> Questo sembra forzare la chiusura del task excel,
>> secondo me ha il difetto che se tu hai una finestra
>> excel aperta per altri motivi ti chiude anche quella
>> o almeno credo perché non ho provato.
>>
>> Secondo me dovresti cercare tra le impostazioni
>> globali di excel e concedere il controllo completo
>> a everyone da li.
>>
>> Hai altri utenti che usano la tua applicazione?
>> A loro cosa succede?
>>
>> Io faccio molta automazione Excel e questo problema
>> non l'ho mai avuto e i tuoi sorgenti non sembrano avere
>> niente di particolare.
>>
>> Ciao
>> Claudio
>>
>>
>
> Ho notato che succede a quei clienti che sono passati da office 97 (
> vecchio ) a office 2010, 13, etc..
> Anzi, no so' per quale motivo alcuni che hanno Office 2007 funzionava
> dopo ( forse qualche update di SP su Office ) non ha piu' funzionato.
>
> Excel lo uso poco ( i miei clienti lo usano molto )
> quindi non so' di impostazioni, mi puoi spiegare meglio ?.

Anch'io come te uso poco Excel ed anche i miei clienti lo usano molto.
Io continuo ad usare una vecchia licenza di Office 2000 e non intendo
cambiarla.

Come ti dicevo il problema che hai tu non l'ho mai avuto. e quindi non
so, però mi ricordo che excel ha delle configurazioni globali dedicate
soprattutto alla sicurezza, ad esempio per attivare gli script. Mi
è successo che dovevo attivare dei comandi VBA ed ho dovuto attivarli
in modo globale. Forse in quelle impostazioni c'è anche qualcosa che
ti riguarda.

Comunque se agli utenti no da fastidio che gli uccidi tutti i task
di Excel è ok la tua soluzione.

> P.S. sembrava morto questo forum )    eppur si scrive 

Anch'io ci passo per sbaglio ogni tanto. 

Ciao.
Solving Re: EXCEL
on Fri, 13 May 2016 11:44:12 +0200
Il 13/05/2016 10.26, Claudio Driussi ha scritto:
> Il 04/05/2016 17:58, Solving ha scritto:
>> Il 04/05/2016 17.51, Claudio Driussi ha scritto:
>>> Il 12/02/2016 18:24, Solving ha scritto:
>>>
>>>>> Mi capita che creando un file Excel con Activex da Alaska
>>>>> Quando lo apro con excel ho il cursore che gira all'infinito
>>>>> e non riesco ad eseguire nessuna operazione
>>>>> se non di chiuderlo da task manager.
>>>>>
>>>>> Per usarlo correttamente devo aprire le propieta' del
>>>>> file generato e mettere nella voce Protezione - Controllo
>>>>> completo su Everyone.
>>>
>>>>
>>>> Per adesso con inserita la seguente riga alla fine.
>>>>
>>>> dopo oExcel:Destroy()
>>>>
>>>>   RunShell("/C TaskKill /F /IM EXCEL.EXE /T")
>>>>
>>>> Sembra funzionare
>>>
>>> Questo sembra forzare la chiusura del task excel,
>>> secondo me ha il difetto che se tu hai una finestra
>>> excel aperta per altri motivi ti chiude anche quella
>>> o almeno credo perché non ho provato.
>>>
>>> Secondo me dovresti cercare tra le impostazioni
>>> globali di excel e concedere il controllo completo
>>> a everyone da li.
>>>
>>> Hai altri utenti che usano la tua applicazione?
>>> A loro cosa succede?
>>>
>>> Io faccio molta automazione Excel e questo problema
>>> non l'ho mai avuto e i tuoi sorgenti non sembrano avere
>>> niente di particolare.
>>>
>>> Ciao
>>> Claudio
>>>
>>>
>>
>> Ho notato che succede a quei clienti che sono passati da office 97 (
>> vecchio ) a office 2010, 13, etc..
>> Anzi, no so' per quale motivo alcuni che hanno Office 2007 funzionava
>> dopo ( forse qualche update di SP su Office ) non ha piu' funzionato.
>>
>> Excel lo uso poco ( i miei clienti lo usano molto )
>> quindi non so' di impostazioni, mi puoi spiegare meglio ?.
>
> Anch'io come te uso poco Excel ed anche i miei clienti lo usano molto.
> Io continuo ad usare una vecchia licenza di Office 2000 e non intendo
> cambiarla.
>
> Come ti dicevo il problema che hai tu non l'ho mai avuto. e quindi non
> so, però mi ricordo che excel ha delle configurazioni globali dedicate
> soprattutto alla sicurezza, ad esempio per attivare gli script. Mi
> è successo che dovevo attivare dei comandi VBA ed ho dovuto attivarli
> in modo globale. Forse in quelle impostazioni c'è anche qualcosa che
> ti riguarda.
>
> Comunque se agli utenti no da fastidio che gli uccidi tutti i task
> di Excel è ok la tua soluzione.
>
>> P.S. sembrava morto questo forum )    eppur si scrive 
>
> Anch'io ci passo per sbaglio ogni tanto. 
>
> Ciao.
>

OK Grazie, lascio il kill.

P.S.
Ci passi per sbaglio ??? 
Aggiorna il navigatore 

al WWF hanno aperto un commissione per noi (clipperiani/alaskiani) 

Ciao
Claudio Driussi Re: EXCEL
on Wed, 18 May 2016 15:53:35 +0200
Il 13/05/2016 11:44, Solving ha scritto:
>>> P.S. sembrava morto questo forum )    eppur si scrive 
>>
>> Anch'io ci passo per sbaglio ogni tanto. 
>>
>> Ciao.
>>
>
> OK Grazie, lascio il kill.
>
> P.S.
> Ci passi per sbaglio ??? 
> Aggiorna il navigatore 
>
> al WWF hanno aperto un commissione per noi (clipperiani/alaskiani) 



Pensa che io quando mi chiedono: Con che cosa è scritto?
rispondo: Una specie di Visual Basic 
Guido BaiocchiRe: EXCEL
on Thu, 19 May 2016 16:04:37 +0200
Il 04/02/2016 20:04, Solving ha scritto:
> Salve
> Mi capita che creando un file Excel con Activex da Alaska
> Quando lo apro con excel ho il cursore che gira all'infinito
> e non riesco ad eseguire nessuna operazione
> se non di chiuderlo da task manager.
>
> Per usarlo correttamente devo aprire le propieta' del
> file generato e mettere nella voce Protezione - Controllo
> completo su Everyone.
>
> Info ?
>
> Grazie

Salve,
dopo le ActiveX di Excel e di Open/Libre Office ho trovato un approccio 
alternativo per le esportazioni nel formato XLS e cioè tramite un 
compilato in FreePascal a cui passo dei files .DBF, il risultato finale 
è quello del file allegato, dopo di chè basta fare salva nel formato 
desiderato.
Tutto con un eseguibile che non necessità di librerie registrate nel 
sistema.

Non sono ancora ad una versione definitiva ma se qualcuno ha bisogno dei 
5MByte di sorgenti me lo faccia sapere, non so quale è il limite del 
forum per le dimensioni dei files.

Saluti a tutti


foglio1.jpg
foglio1.jpg
Claudio DriussiRe: EXCEL
on Sat, 21 May 2016 21:12:42 +0200
Il 19/05/2016 16:04, Guido Baiocchi ha scritto:

> Salve,
> dopo le ActiveX di Excel e di Open/Libre Office ho trovato un approccio
> alternativo per le esportazioni nel formato XLS e cioè tramite un
> compilato in FreePascal a cui passo dei files .DBF, il risultato finale
> è quello del file allegato, dopo di chè basta fare salva nel formato
> desiderato.
> Tutto con un eseguibile che non necessità di librerie registrate nel
> sistema.

Interessante, hai qualche esempio di automazione con libreoffice?

> Non sono ancora ad una versione definitiva ma se qualcuno ha bisogno dei
> 5MByte di sorgenti me lo faccia sapere, non so quale è il limite del
> forum per le dimensioni dei files.

Sai se si compila con Delphi?
In alternativa , quanto è complesso installare l'ambiente di sviluppo 
freepascal?

Potresti mandarmelo al mio indirizzo di posta, o in alternativa
postarlo da qualche parte da cui si può scaricare.

> Saluti a tutti

Ciao, grazie
Claudio
Guido BaiocchiRe: EXCEL
on Wed, 25 May 2016 19:30:20 +0200
Il 21/05/2016 21:12, "Claudio Driussi" ha scritto:
> Il 19/05/2016 16:04, Guido Baiocchi ha scritto:
>
>> Salve,
>> dopo le ActiveX di Excel e di Open/Libre Office ho trovato un approccio
>> alternativo per le esportazioni nel formato XLS e cioè tramite un
>> compilato in FreePascal a cui passo dei files .DBF, il risultato finale
>> è quello del file allegato, dopo di chè basta fare salva nel formato
>> desiderato.
>> Tutto con un eseguibile che non necessità di librerie registrate nel
>> sistema.
>
> Interessante, hai qualche esempio di automazione con libreoffice?
>
>> Non sono ancora ad una versione definitiva ma se qualcuno ha bisogno dei
>> 5MByte di sorgenti me lo faccia sapere, non so quale è il limite del
>> forum per le dimensioni dei files.
>
> Sai se si compila con Delphi?
> In alternativa , quanto è complesso installare l'ambiente di sviluppo
> freepascal?
>
> Potresti mandarmelo al mio indirizzo di posta, o in alternativa
> postarlo da qualche parte da cui si può scaricare.
>
>> Saluti a tutti
>
> Ciao, grazie
> Claudio
>
>
Salve di nuovo
ho fatto un po di pulizia nel progetto, lo trovi in allegato.

Installare FreePascal è semplicissimo, usa la 32bit:
http://www.lazarus-ide.org/index.php?page=downloads

includi questo componente:
http://www.lazarus-ide.org/index.php?page=downloads

apri il progetto e compila.

Considera che non ho inventato niente, tutto si basa sul componente 
indicato, trova la funzione TForm1.CaricaLibro() quella è l'unica 
modifica fatta da me.

Includo anche un sorgente di automazione con LibreOffice

Buon divertimento e saluti a tutti

Guido Baiocchi


G7foglietto.7z
G7dbx2excel.prg
G7foglietto.7z
G7dbx2excel.prg
Claudio DriussiRe: EXCEL
on Thu, 26 May 2016 09:06:54 +0200
Ti ringrazio tantissimo e ti farò sapere.

Claudio


Il 25/05/2016 19:30, Guido Baiocchi ha scritto:
> Il 21/05/2016 21:12, "Claudio Driussi" ha scritto:
>> Il 19/05/2016 16:04, Guido Baiocchi ha scritto:
>>
>>> Salve,
>>> dopo le ActiveX di Excel e di Open/Libre Office ho trovato un approccio
>>> alternativo per le esportazioni nel formato XLS e cioè tramite un
>>> compilato in FreePascal a cui passo dei files .DBF, il risultato finale
>>> è quello del file allegato, dopo di chè basta fare salva nel formato
>>> desiderato.
>>> Tutto con un eseguibile che non necessità di librerie registrate nel
>>> sistema.
>>
>> Interessante, hai qualche esempio di automazione con libreoffice?
>>
>>> Non sono ancora ad una versione definitiva ma se qualcuno ha bisogno dei
>>> 5MByte di sorgenti me lo faccia sapere, non so quale è il limite del
>>> forum per le dimensioni dei files.
>>
>> Sai se si compila con Delphi?
>> In alternativa , quanto è complesso installare l'ambiente di sviluppo
>> freepascal?
>>
>> Potresti mandarmelo al mio indirizzo di posta, o in alternativa
>> postarlo da qualche parte da cui si può scaricare.
>>
>>> Saluti a tutti
>>
>> Ciao, grazie
>> Claudio
>>
>>
> Salve di nuovo
> ho fatto un po di pulizia nel progetto, lo trovi in allegato.
>
> Installare FreePascal è semplicissimo, usa la 32bit:
> http://www.lazarus-ide.org/index.php?page=downloads
>
> includi questo componente:
> http://www.lazarus-ide.org/index.php?page=downloads
>
> apri il progetto e compila.
>
> Considera che non ho inventato niente, tutto si basa sul componente
> indicato, trova la funzione TForm1.CaricaLibro() quella è l'unica
> modifica fatta da me.
>
> Includo anche un sorgente di automazione con LibreOffice
>
> Buon divertimento e saluti a tutti
>
> Guido Baiocchi
>
>
>
Claudio DriussiRe: EXCEL
on Thu, 26 May 2016 11:25:01 +0200
Stupendo!

Ho provato gli activex per LibreOffice ed Excel e vanno benissimo.

Quello per Excel forse è un po' meglio di quello che ho io ma siamo
lì, invece quello per LibreOffice è magnifico.

Sul progetto freepascal invece ho qualche dubbio.

Siccome io uso Delphi7, sai se ci sono conflitti ad installare
FreePascal? Forse solo le associazioni delle estensioni?

Ho visto velocemente che il progetto fa un eseguibile che
contiene lo spreadsheet, ma come fai a passare i dati da
Xbase++ al programma Foglietto?

Ho visto che c'è aptridati.pas che carica un DBF,
ma questo non gestisce gli array e comunque non dati
dinamici.

Lo vedo interessante solo se l'utente non ha ne Excel
ne LibreOffice, ma LibreOffice è free e si può sempre
installare.

Mi sono perso qualcosa? Che convenienza hai ad usarlo?

Grazie!
Ciao



Il 25/05/2016 19:30, Guido Baiocchi ha scritto:
> Il 21/05/2016 21:12, "Claudio Driussi" ha scritto:
>> Il 19/05/2016 16:04, Guido Baiocchi ha scritto:
>>
>>> Salve,
>>> dopo le ActiveX di Excel e di Open/Libre Office ho trovato un approccio
>>> alternativo per le esportazioni nel formato XLS e cioè tramite un
>>> compilato in FreePascal a cui passo dei files .DBF, il risultato finale
>>> è quello del file allegato, dopo di chè basta fare salva nel formato
>>> desiderato.
>>> Tutto con un eseguibile che non necessità di librerie registrate nel
>>> sistema.
>>
>> Interessante, hai qualche esempio di automazione con libreoffice?
>>
>>> Non sono ancora ad una versione definitiva ma se qualcuno ha bisogno dei
>>> 5MByte di sorgenti me lo faccia sapere, non so quale è il limite del
>>> forum per le dimensioni dei files.
>>
>> Sai se si compila con Delphi?
>> In alternativa , quanto è complesso installare l'ambiente di sviluppo
>> freepascal?
>>
>> Potresti mandarmelo al mio indirizzo di posta, o in alternativa
>> postarlo da qualche parte da cui si può scaricare.
>>
>>> Saluti a tutti
>>
>> Ciao, grazie
>> Claudio
>>
>>
> Salve di nuovo
> ho fatto un po di pulizia nel progetto, lo trovi in allegato.
>
> Installare FreePascal è semplicissimo, usa la 32bit:
> http://www.lazarus-ide.org/index.php?page=downloads
>
> includi questo componente:
> http://www.lazarus-ide.org/index.php?page=downloads
>
> apri il progetto e compila.
>
> Considera che non ho inventato niente, tutto si basa sul componente
> indicato, trova la funzione TForm1.CaricaLibro() quella è l'unica
> modifica fatta da me.
>
> Includo anche un sorgente di automazione con LibreOffice
>
> Buon divertimento e saluti a tutti
>
> Guido Baiocchi
>
>
>
Guido BaiocchiRe: EXCEL
on Mon, 30 May 2016 13:10:27 +0200
Il 26/05/2016 11:25, "Claudio Driussi" ha scritto:
> Stupendo!
>
> Ho provato gli activex per LibreOffice ed Excel e vanno benissimo.
>
> Quello per Excel forse è un po' meglio di quello che ho io ma siamo
> lì, invece quello per LibreOffice è magnifico.
>
> Sul progetto freepascal invece ho qualche dubbio.
>
> Siccome io uso Delphi7, sai se ci sono conflitti ad installare
> FreePascal? Forse solo le associazioni delle estensioni?
>
> Ho visto velocemente che il progetto fa un eseguibile che
> contiene lo spreadsheet, ma come fai a passare i dati da
> Xbase++ al programma Foglietto?
>
> Ho visto che c'è aptridati.pas che carica un DBF,
> ma questo non gestisce gli array e comunque non dati
> dinamici.
>
> Lo vedo interessante solo se l'utente non ha ne Excel
> ne LibreOffice, ma LibreOffice è free e si può sempre
> installare.
>
> Mi sono perso qualcosa? Che convenienza hai ad usarlo?
>
> Grazie!
> Ciao
>
>
>
> Il 25/05/2016 19:30, Guido Baiocchi ha scritto:
>> Il 21/05/2016 21:12, "Claudio Driussi" ha scritto:
>>> Il 19/05/2016 16:04, Guido Baiocchi ha scritto:
>>>
>>>> Salve,
>>>> dopo le ActiveX di Excel e di Open/Libre Office ho trovato un approccio
>>>> alternativo per le esportazioni nel formato XLS e cioè tramite un
>>>> compilato in FreePascal a cui passo dei files .DBF, il risultato finale
>>>> è quello del file allegato, dopo di chè basta fare salva nel formato
>>>> desiderato.
>>>> Tutto con un eseguibile che non necessità di librerie registrate nel
>>>> sistema.
>>>
>>> Interessante, hai qualche esempio di automazione con libreoffice?
>>>
>>>> Non sono ancora ad una versione definitiva ma se qualcuno ha bisogno
>>>> dei
>>>> 5MByte di sorgenti me lo faccia sapere, non so quale è il limite del
>>>> forum per le dimensioni dei files.
>>>
>>> Sai se si compila con Delphi?
>>> In alternativa , quanto è complesso installare l'ambiente di sviluppo
>>> freepascal?
>>>
>>> Potresti mandarmelo al mio indirizzo di posta, o in alternativa
>>> postarlo da qualche parte da cui si può scaricare.
>>>
>>>> Saluti a tutti
>>>
>>> Ciao, grazie
>>> Claudio
>>>
>>>
>> Salve di nuovo
>> ho fatto un po di pulizia nel progetto, lo trovi in allegato.
>>
>> Installare FreePascal è semplicissimo, usa la 32bit:
>> http://www.lazarus-ide.org/index.php?page=downloads
>>
>> includi questo componente:
>> http://www.lazarus-ide.org/index.php?page=downloads
>>
>> apri il progetto e compila.
>>
>> Considera che non ho inventato niente, tutto si basa sul componente
>> indicato, trova la funzione TForm1.CaricaLibro() quella è l'unica
>> modifica fatta da me.
>>
>> Includo anche un sorgente di automazione con LibreOffice
>>
>> Buon divertimento e saluti a tutti
>>
>> Guido Baiocchi
>>
>>
>>
>
Salve,

su eventuali conflitti di installazione FreePascal-Lazarus / Delphi non 
so aiutarti, ho usato pochissimo Delphi e solo su Macchina Virtuale 
apposta per lui così da non avere conflitti.
Magari potresti fare la stessa cosa con FreePascal.

Per quello che riguarda il passaggio dati a Foglietto in allegato trovi 
i DBF di esempio; in pratica ESPOAN0.DBF contiene l'elenco dei DBF da 
caricare ed ogni DBF i dati per ogni foglio dell'XLS.
In futuro vorrei aggiungere un descrittore di caratteristiche dei campi.

Per rispondere alla domanda del perchè usare quest'oggetto al posto di 
Excel o LibreOffice semplicemente perchè:
a) Alcune volte mi è capitato di non poter usare le ActiveX di Excel per 
questioni di sicurezza del sistema
b) Altre volte con clienti che usano OpenOffice mi sono trovato in una 
situazione dove non registrava le ActiveX

In breve... diverse volte le ActiveX mi hanno fatto dei "capricci" e 
quando ho trovato quel componente di FreePascal ho visto la possibilità 
di poter creare le mie esportazioni indipendentemente dai vincoli di 
sistema e la cosa mi è piaciuta.
Non so dirti se è una scelta vincente ma qualche problema l'ho risolto così.

Se vuoi qualche delucidazione fammi sapere

Saluti

Guido Baiocchi


ESPO.zip
ESPO.zip
Claudio Driussi Re: EXCEL
on Tue, 31 May 2016 08:39:29 +0200
Il 30/05/2016 13:10, Guido Baiocchi ha scritto:

> Per rispondere alla domanda del perchè usare quest'oggetto al posto di
> Excel o LibreOffice semplicemente perchè:
> a) Alcune volte mi è capitato di non poter usare le ActiveX di Excel per
> questioni di sicurezza del sistema
> b) Altre volte con clienti che usano OpenOffice mi sono trovato in una
> situazione dove non registrava le ActiveX

Ok, per quanto mi riguarda non ho avuto grossi problemi con
le activex, quindi proseguo su questa strada fino a che non
mi troverò in difficoltà 

> In breve... diverse volte le ActiveX mi hanno fatto dei "capricci" e
> quando ho trovato quel componente di FreePascal ho visto la possibilità
> di poter creare le mie esportazioni indipendentemente dai vincoli di
> sistema e la cosa mi è piaciuta.
> Non so dirti se è una scelta vincente ma qualche problema l'ho risolto
> così.
>
> Se vuoi qualche delucidazione fammi sapere

Nel frattempo ho fatto qualche esperimento con LibreOffice e
grazie agli spunti trovati nei tuoi sorgenti sono riuscito ad
ottenere buoni risultati.

Mi manca ancora qualche dettaglio per importare fogli LibreOffice
ma dovrei riuscire a finire.

Ho trovato la documentazione difficile da reperire e frammentaria
quindi è abbastanza difficile trovare la strada giusta per fare
le cose.

Ad esempio ho trovato la il metodo range:getDataArray()
che dovrebbe restituire un array con i valori delle celle,
ma probabilmente restituisce un array variant non compatibile
con gli array di Xbase++

Tu come hai fatto per trovare documentazione ed esempi?

Se l'argomento ti interessa, possiamo proseguire in privato
o magari anche con skype.

nel frattempo di allego un po' di codice, ho fatto 4 classi
per leggere e scrivere da fogli ad array e viceversa,
probabilmente non funzioneranno immediatamente perché
fanno riferimento a funzioni esterne, però possono
essere uno spunto interessante.

libreoffice2array non è ancora finita.

Claudio

===========================================================

///array2excel////////////////////////////////////////////////////////////////
 
     
 
     
         PREPARA UN FOGLIO EXCEL CONTENENTE I DATI DI UN ARRAY 
     
 
     
 
     
//////////////////////////////////////////////////////////////////////////////

class array2excel
   exported:
     var aData        array dei dati da esportare
     var oExcel       oggetto automazione excel
     var oSheet       Foglio di lavoro che contiene i dati
     var lTrim        eseguo automaticamente il trim alle stringhe

      
------------------------------------------------------------------------
      prepara il foglio excel
     inline method init(aData, lVisible)
       local t
       ::aData := aData
       ::lTrim := .t.

       default lVisible to .t.
       ::oExcel := CreateObject("Excel.Application")
       ::oExcel:DisplayAlerts := .f.
       ::oExcel:visible := lVisible
       t := ::oExcel:workbooks:Add()
       ::oSheet := t:ActiveSheet
     return self

      
------------------------------------------------------------------------
      assegna i dati al foglio excel
     inline method setdata(aData)
       local t,i

       default aData to ::aData
       ::aData := aData

       if ::lTrim
         for i := 1 to len(::aData)
           aeval(::aData[i], {|x,j| 
iif(valtype(::aData[i,j])=='C',::aData[i,j] := trim(::aData[i,j]),) } )
           next i
         endif
       t := calcExcelRange(len(aData),len(aData[1]))
       ::oSheet:range(t):value := aData
     return self

      
------------------------------------------------------------------------
      formatta il foglio che contiene i dati
     inline method format
       ::oSheet:Cells:Select()
       ::oSheet:Columns:AutoFit()
       ::oSheet:Rows:AutoFit()
       ::oSheet:Range("A1"):Select()
     return self

      
------------------------------------------------------------------------
      visualizza il foglio e chiude
     inline method close
       ::oExcel:visible := .t.
       ::oExcel:Destroy()
     return self

endclass


//*-------------------------------   a2Excel 
-------------------------------
 prepara un foglio excel contenente i dati di aData con le opzioni di 
default

function a2Excel(aData)
   array2excel():new(aData):setdata():format():close()
return nil



//*-----------------------------   a2excel_test 
-----------------------------
 test per a2excel

function a2excel_test(aData)
   if empty(aData)
     aData := {}
     aadd(aData,{"FLD01","FLD02","FLD03","FLD04"})
     aadd(aData,{ctod("12/03/2015"),1,.t.,"STRING01"})
     aadd(aData,{ctod("22/05/2015"),2,.f.,"STRING02"})
     aadd(aData,{ctod("06/07/2015"),3,.f.,"STRING03"})
     aadd(aData,{ctod("15/09/2015"),4,.t.,"STRING04"})
     aadd(aData,{ctod("02/10/2015"),5,.t.,"STRING05"})
     endif
   a2Excel(aData)
return nil



///excel2array////////////////////////////////////////////////////////////////
 
     
 
     
         LEGGE UN FOGLIO EXCEL E LO DEPOSITA IN UN ARRAY 
     
 
     
 
     
//////////////////////////////////////////////////////////////////////////////

class excel2array
   exported:
     var aData        array dei dati da esportare
     var aTypes       array dei tipi da forzare su singole celle
     var oExcel       oggetto automazione excel
     var oSheet       Foglio di lavoro che contiene i dati

      
------------------------------------------------------------------------
      prepara il foglio excel
     inline method init(cFile)
       local t
       ::oExcel := CreateObject("Excel.Application")
       ::oExcel:DisplayAlerts := .f.
       ::oExcel:visible       := .f.
       t := ::oExcel:workbooks:Open(cFile)
       ::oSheet := t:ActiveSheet
       ::aData := ::oSheet:usedRange:value
       ::aTypes := {}
     return self

      
------------------------------------------------------------------------
      legge i dati contenuti del file excel e restituisce un array 
bidimensionale
      nel formato previsto dal template, ad esempio {'C','N','D','L'}.
      Si possono passare la riga iniziale e la riga finale, per 
default si va
      dalla riga 2 fino alla fine. se la dimensione della riga e' 
inferiore, si
      restituiscono valori nulli, le rige maggiori vengono troncate
     
     inline method read(aTemplate, nFromRow, nToRow)
       local i,j,t,a,jj,tt
       local nLen := len(aTemplate)

       default nFromRow to 2
       default nToRow to len(::aData)

       a := {}
       for i := nFromRow to nToRow
         t := aClone(::aData[i])
         aSize(t,nLen)
         for j := 1 to nLen
           default t[j] to ''
           jj := ascan(::aTypes,{|x| x[1]==i .and. x[2]==j })
           if jj==0
             tt := aTemplate[j]
           else
             tt := ::aTypes[jj,3]
             endif
           do case
              case aTemplate[j] $ 'CM' ; t[j] := toString(t[j],.t.,0)
             case tt $ 'CM' ; t[j] := var2char(t[j])
             case tt == 'N' ; t[j] := toNum(t[j])
             case tt == 'D' ; t[j] := toDate(t[j])
             case tt == 'L' ; t[j] := toBool(t[j])
             otherwise                ; t[j] := nil
             endcase
           next j
         aadd(a,t)
         next i
     return a

      
------------------------------------------------------------------------
      visualizza il foglio e chiude
     inline method close(lLeaveOpen)
       default lLeaveOpen to .f.
       ::oExcel:visible := lLeaveOpen
       if !lLeaveOpen
         ::oExcel:ActiveWorkbook:Close(.f.)
         ::oExcel:quit()
         endif
       ::oExcel:Destroy()
     return self

endclass

//*-------------------------------   Excel2a 
-------------------------------
 legge un foglio excel e restituisce un array bidimensionale nel formato
 indicato dal template passato a partire dalla riga 2

function Excel2a(cFile, aTemplate, nFromRow)
   local o := excel2array():new(cFile)
   local a := o:read(aTemplate, nFromRow)
   o:close()
return a

//*-----------------------------   Excel2a_test 
-----------------------------
 test per Excel2array

function Excel2a_test()
   local cFile := 'S:\XPP\AGC\_ALTRO\test_excel2array.xls'
   local o := excel2array():new(cFile)
   local a := o:read({'C','C','N','D','L','C'})
   aadd(o:aTypes,{4,6,"N"})  forzo il tipo della cella 4,6
   a := o:read({'C','C','N','D','L','C'})
   o:close()
return nil








///array2libreoffice//////////////////////////////////////////////////////////
 
     
 
     
       PREPARA UN FOGLIO LIBREOFFICE CONTENENTE I DATI DI UN ARRAY 
     
 
     
 
     
//////////////////////////////////////////////////////////////////////////////

class array2libreoffice
   exported:
     var aData        array dei dati da esportare
     var oLibre       oggetto automazione
     var oDesktop    
     var oDocument   
     var oSheet       Foglio di lavoro che contiene i dati
     var lTrim        eseguo automaticamente il trim alle stringhe

      
------------------------------------------------------------------------
      prepara il foglio excel
     inline method init(aData, lVisible)
       local t
       ::aData := aData
       ::lTrim := .t.

       default lVisible to .t.
       ::oLibre := CreateObject("com.sun.star.ServiceManager")
       ::oDesktop := ::oLibre:createInstance("com.sun.star.frame.Desktop")
       ::oDocument := 
::oDesktop:loadComponentFromURL("private:factory/scalc"  , "_blank", 0, 
VTType():New( {}, VT_ARRAY+VT_VARIANT ) )
       t = ::oDocument:getSheets()
       ::oSheet := t:getByIndex(0)
     return self

      
------------------------------------------------------------------------
      assegna i dati al foglio excel
     inline method setdata(aData)
       local t,i

       default aData to ::aData
       ::aData := aData

       aData := array(len(::aData[1]), len(::aData))
       for i := 1 to len(::aData)
         aeval(::aData[i], {|x,j| aData[j,i] := ::SetValue(i,j) } )
         next i

       t := calcExcelRange(len(aData[1]), len(aData))
       ::oSheet:getCellRangeByName(t):setDataArray(VTType():New( aData, 
  VT_ARRAY+VT_VARIANT ))
     return self

      
------------------------------------------------------------------------
      formatta il foglio che contiene i dati
     inline method SetValue(i,j)
       local x := ::aData[i,j]
       local v := valtype(x)
       do case
         case v=='C'  ;  if ::ltrim ; x := alltrim(x) ; endif
         case v=='D'  ;  x := dtoc(x)
 
::oSheet:getCellRangeByposition(j-1,i-1,j-1,i-1):setPropertyValue( 
"NumberFormat", 36 )
         case v=='L'  ;  x := iif(x,1,0)
 
::oSheet:getCellRangeByposition(j-1,i-1,j-1,i-1):setPropertyValue( 
"NumberFormat", 99 )
         endcase
     return x


      
------------------------------------------------------------------------
      formatta il foglio che contiene i dati
     inline method format
       local i
       local oColumns := ::oSheet:getColumns()

       for i := 0 to len(::aData[1])-1
         oColumns:getByIndex(i):setPropertyValue( "OptimalWidth", .t. )
         next i

     return self

      
------------------------------------------------------------------------
      visualizza il foglio e chiude
     inline method close
       ::oDesktop:destroy()
       ::oDocument:destroy()
       ::oLibre:destroy()
     return self

endclass

//*----------------------------   a2libreoffice 
------------------------------
 prepara un foglio excel contenente i dati di aData con le opzioni di 
default

function a2libreoffice(aData)
   array2libreoffice():new(aData):setdata():format():close()
return nil


//*--------------------------   a2libreoffice_test 
---------------------------
 test per a2excel

function a2libreoffice_test(aData)
   if empty(aData)
     aData := {}
     aadd(aData,{"FLD01","FLD02","FLD03","FLD04"})
     aadd(aData,{ctod("12/03/2015"),1,.t.,"STRING01"})
     aadd(aData,{ctod("22/05/2015"),2,.f.,"STRING02"})
     aadd(aData,{ctod("06/07/2015"),3,.f.,"STRING03"})
     aadd(aData,{ctod("15/09/2015"),4,.t.,"STRING04"})
     aadd(aData,{ctod("02/10/2015"),5,.t.,"STRING05"})
     endif
   a2libreoffice(aData)
return nil



///libreoffice2array//////////////////////////////////////////////////////////
 
     
 
     
         LEGGE UN FOGLIO EXCEL E LO DEPOSITA IN UN ARRAY 
     
 
     
 
     
//////////////////////////////////////////////////////////////////////////////

class libreoffice2array
   exported:
     var aData        array dei dati da esportare
     var aTypes       array dei tipi da forzare su singole celle
     var oLibre       oggetto automazione
     var oDesktop    
     var oDocument   
     var oSheet       Foglio di lavoro che contiene i dati

      
------------------------------------------------------------------------
      prepara il foglio excel
     inline method init(cFile)
       local t
       ::oLibre := CreateObject("com.sun.star.ServiceManager")
       ::oDesktop := ::oLibre:createInstance("com.sun.star.frame.Desktop")
       cFile := "file:///"+strtran(cFile,"\","/")
       ::oDocument := ::oDesktop:loadComponentFromURL(cFile, "_blank", 
0, VTType():New( {}, VT_ARRAY+VT_VARIANT ) )
       t := ::oDocument:getSheets()
       ::oSheet := t:getByIndex(0)

       t := ::usedArea(.t.)
       t := ::usedArea(.f.)
       ::aData := t:getDataArray()

       ::aTypes := {}
     return self

      
------------------------------------------------------------------------
     inline method usedArea(lName)
       local oRg
       oRg = ::oSheet:createCursor()
       oRg:gotoStartOfUsedArea(.f.)
       oRg:gotoEndOfUsedArea(.t.)
       if lName
         return oRg:AbsoluteName()
         endif
     return oRg


      
------------------------------------------------------------------------
      legge i dati contenuti del file excel e restituisce un array 
bidimensionale
      nel formato previsto dal template, ad esempio {'C','N','D','L'}.
      Si possono passare la riga iniziale e la riga finale, per 
default si va
      dalla riga 2 fino alla fine. se la dimensione della riga e' 
inferiore, si
      restituiscono valori nulli, le rige maggiori vengono troncate
     
     inline method read(aTemplate, nFromRow, nToRow)
       local i,j,t,a,jj,tt
/*
       local nLen := len(aTemplate)

       default nFromRow to 2
       default nToRow to len(::aData)

       a := {}
       for i := nFromRow to nToRow
         t := aClone(::aData[i])
         aSize(t,nLen)
         for j := 1 to nLen
           default t[j] to ''
           jj := ascan(::aTypes,{|x| x[1]==i .and. x[2]==j })
           if jj==0
             tt := aTemplate[j]
           else
             tt := ::aTypes[jj,3]
             endif
           do case
              case aTemplate[j] $ 'CM' ; t[j] := toString(t[j],.t.,0)
             case tt $ 'CM' ; t[j] := var2char(t[j])
             case tt == 'N' ; t[j] := toNum(t[j])
             case tt == 'D' ; t[j] := toDate(t[j])
             case tt == 'L' ; t[j] := toBool(t[j])
             otherwise                ; t[j] := nil
             endcase
           next j
         aadd(a,t)
         next i
*/
     return a

      
------------------------------------------------------------------------
      visualizza il foglio e chiude
     inline method close(lLeaveOpen)
       default lLeaveOpen to .f.
      ::oExcel:visible := lLeaveOpen
      if !lLeaveOpen
        ::oExcel:ActiveWorkbook:Close(.f.)
        ::oExcel:quit()
        endif

       ::oDesktop:destroy()
       ::oDocument:destroy()
       ::oLibre:destroy()
     return self

endclass

//*-----------------------------   libreoffice2a 
----------------------------
 legge un foglio excel e restituisce un array bidimensionale nel formato
 indicato dal template passato a partire dalla riga 2

function libreoffice2a(cFile, aTemplate, nFromRow)
   local o := excel2array():new(cFile)
   local a := o:read(aTemplate, nFromRow)
   o:close()
return a

//*--------------------------   libreoffice2a_test 
--------------------------
 test per Excel2array

function libreoffice2a_test()
   local cFile := 'S:\XPP\AGC\_ALTRO\test_librel2array.ods'
   local o := libreoffice2array():new(cFile)
   local a := o:read({'C','C','N','D','L','C'})
  aadd(o:aTypes,{4,6,"N"})  forzo il tipo della cella 4,6
  a := o:read({'C','C','N','D','L','C'})
   o:close()
return nil



 ---------------------------   calcExcelRange 
------------------------------
 support function to calc range of excel selection
function calcExcelRange(nRow,nCol)
   local cRange := 'A1:'
   local n1,n2
   n1 := int(nCol/26)
   n2 := nCol % 26
   if empty(n2)
     n2 := 26
     n1--
     endif
   if nCol > 26
     cRange += chr(64 + n1)
     endif
   cRange += chr(64 + n2)
return cRange +ltrim(str(nRow))
Solving Re: EXCEL
on Wed, 01 Jun 2016 08:51:56 +0200
Ottimi Esempi.
Utili per confronti e provare alternative.

Grazie


 > Il 31/05/2016 8.39, Claudio Driussi ha scritto:


>
> Se l'argomento ti interessa, possiamo proseguire in privato
> o magari anche con skype.
>

e perche' ?
qui va bene, tanto non penso disturbi qualcuno
tanto per quanti siamo  .