Author | Topic: 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 Driussi | Re: 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 Driussi | Re: 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 Baiocchi | Re: 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 | |
Claudio Driussi | Re: 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 Baiocchi | Re: 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 | |
Claudio Driussi | Re: 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 Driussi | Re: 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 Baiocchi | Re: 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 | |
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 . |