Import/export Excel files - Funziona!!

Forum dedicato ai programmatori di X# in lingua italiana – Italian language forum

Moderator: wriedmann

User avatar
Gfb22
Posts: 105
Joined: Sat Oct 08, 2022 7:43 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by Gfb22 »

...Con l'ultimo esempio viene visualizzato anche il mio file Excel: benissimo!
Grazie.
gfb
xls3.jpg
xls3.jpg (45.72 KiB) Viewed 1289 times
gfb
User avatar
Gfb22
Posts: 105
Joined: Sat Oct 08, 2022 7:43 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by Gfb22 »

Wolfgang buonasera.
Ho ripreso il tuo esempio, compreso (+/-) come funziona di massima e alla fine fatto procedura per convertire il file di Excel in DBF leggendo la struttura del file di Excel, creando il file DBF per poi leggere ogni riga del file Excel per scrivere nuovi record nel file DBF e tutto funziona!! 
...ecco il codice che ho usato per fare la scansione del file Excel e creare il file DBF con la struttura corretta:

Code: Select all

               
            for nRow := 1 upto nRows
                    for nCol := 1 upto nCols             
                        uValue                := oSheet:GetValue( nRow, nCol )
                        if nRow = 1        // Primo giro: nome colonna/campo
                            aStruct[ nCol , 1]    := AllTrim(uValue)
                            aStruct[ nCol , 2]    := ""                        
                            aStruct[ nCol , 3]    := 0
                            aStruct[ nCol , 4]    := 0
                        elseif ! IsNil( uValue )
                            cValType            := ValType( uValue )
                            aStruct[ nCol , 2]    := cValType                        
                            aStruct[ nCol , 3]    := Max( aStruct[ nCol , 3], iif(cValType = "C", Len(AllTrim(uValue) ) , LENNUM(uValue) ) )
                            aStruct[ nCol , 4]    := iif( cValType = "C", 0, Max( aStruct[ nCol , 4],  SetDecimal(uValue) ) ) 
                        endif
                    next  
                next
                cFileDBF    := "C:TEMPTEMPSTRU.dbf" 
                DBCREATE(cFileDBF, aStruct)    // Crea file temporaneo
​​​​​​​-------------------
1) se al posto di un file .xlsx trovo un file .xls?
2) Adesso volevo fare il passaggio inverso, cioè creare un file Excel partendo da un DBF.
Hai qualche suggerimento?
Grazie e buon proseguimento (...non ho premura per questo :-) ...
​​​​​​​
gfb
User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by wriedmann »

Ciao Gian Ferruccio,
benissimo che funziona come ti serve.
Quando trovi un file xls invece del xlsx: purtroppo non funziona perchè il formato del file è completamente diverso. xlsx (come docx e pptx tra l'altro) in sostanza è un file zip che contiene i dati all'interno di diversi file xml, ed è questo che la libreria sfrutta (prova a rinominare un xlsx in zip e poi aprirlo....). Xls invece è un formato proprietario che la libreria usata non riesce a leggere. Ci sono altre librerie per questo.
Per quanto riguarda la scrittura di file xlsx: ovviamente anche questo è possibile. Queste sono le parti rilevanti per crearlo:

Code: Select all

oXlsxFile := IXlsxFile{}
oXlsxFile:CreatePackage()
per aggiungere un foglio:

Code: Select all

if _oXlsxFile:NumSheets == 0
  oXlsSheet := oXlsxFile:AddSheet( "Foglio dati" )
else
  oXlsSheet := oXlsxFile:GetSheet( 1 )
endif
per scrivere dati:

Code: Select all

oXlsSheet:SetValue( nRiga + 4, 2, "nome cliente" )
oXlsSheet:SetValue( nRiga + 4, 3, "articolo" )
e poi per salvarlo:

Code: Select all

oXlsxFile:SaveAs( cXlsFileName )
Saluti
Wolfgang
 
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Gfb22
Posts: 105
Joined: Sat Oct 08, 2022 7:43 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by Gfb22 »

Grazie Wolfgang.
Con VO ho completato le due procedure per convertire i file da DBF a XLSX e da XLSX a DBF e tutto funziona bene.
Ho provato a compilare con XIDE ma ci sono alcuni errori (vedi file allegato), in particolare relativi a OleAutoObjectEx.
Forse mi avevi già dato indicazioni a riguardo ma non le ritrovo.
Grazie!
​​​​​​​ 
ErroriCompiler.txt
(2.97 KiB) Downloaded 85 times
gfb
User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by wriedmann »

Ciao Gian Ferruccio,
in X# non devi usare OleAutoObjectEx, ma puoi usare la libreria direttamente mettendola tra le References. Allora non solo hai codice che viene controllato dal compilatore, ma anche codice più veloce.
Saluti
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Gfb22
Posts: 105
Joined: Sat Oct 08, 2022 7:43 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by Gfb22 »

Buongiorno Wolfgang.
1) "...in X# non devi usare OleAutoObjectEx, ma puoi usare la libreria direttamente mettendola tra le References. " ...Dove trovo la libreria da inserire tra le references?
2) Ho fatto altri passi inserendo quanto sperimentato in VO come Test nella mia app che, in VO, funziona.
Compilando in XIDE mi da l'errore:
"error XS0246: The type or namespace name 'IXlsxFile' could not be found (are you missing a using directive or an assembly reference?)    269,2    Utility.prg    StandardShellWindow:SalvaDBF"
---------
Grazie!
​​​​​​​gfb
gfb
User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by wriedmann »

Buona sera Gian Ferruccio,
scusami la risposta ritardata - ma da buon Italiano sono in ferie e Ferragosto <g>.usa
Per quanto riguarda a tua prima domanda: in VO stai usando la DLL XSharp.Tools.XlsxFile.DLL tramite COM. Visto che questa DLL è una DLL .NET (e precisamente scritta in X#), in X# (come peraltro anche in C# e VB.NET) può essere usata direttamente aggungendola tra le "References".
E per la seconda domanda: dato che non hai incluso la DLL tra le referenze, il compilatore non trova la classe e per questo ti da il messaggio di errore indicato.
Saluti
Wolfgang
P.S. solo la sera sono il albergo e posso accendere il mio PC, durante il giorno leggo solo le mie mail quando tempo e rete me lo permettono
 
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Gfb22
Posts: 105
Joined: Sat Oct 08, 2022 7:43 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by Gfb22 »

:-) :-) Grazie e ...Buone ferie: ci aggiorniamo quando rientri al lavoro e non ho fretta...
Ho comunque provato e, pur avendo le .DLL tra le references, mi da lo stesso errore.
gfb
gfb
User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by wriedmann »

Ciao Gian Ferruccio,
sono di nuovo al lavoro <g>.
Prova ad aggiungere un

Code: Select all

using XSharp.Tools.XlsxFile
in testa al file prg dove stai usando la classe.
Saluti
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Gfb22
Posts: 105
Joined: Sat Oct 08, 2022 7:43 pm
Location: Italy

Import/export Excel files - Esempio ok!

Post by Gfb22 »

Wolfgang, eccomi.
Con il tuo ultimo suggerimento le cose vanno meglio: si è passati da 27 errori si è passati a solo 3 errori che ti scrivo di seguito come codice:

Code: Select all

error XS0144: Cannot create an instance of the abstract type or interface 'XSharp.Tools.XlsxFile.IXlsxFile'    92,3    Start_Excel.prg    StandardShellWindow:SalvaDBF
error XS0103: The name 'LENNUM' does not exist in the current context    126,55    Start_Excel.prg    StandardShellWindow:SalvaDBF
error XS0144: Cannot create an instance of the abstract type or interface 'XSharp.Tools.XlsxFile.IXlsxFile'    184,4    Start_Excel.prg    StandardShellWindow:SalvaXLSX
Compilation failed (3 errors, 5 warnings)
- Due degli errori sono relativi a XlsxFile;
- un errore relativo alla funzione LENNUM(n) che in VO funziona e indica la lunghezza complessiva di un numero (compreso segno e virgola) che in VO ho usato per determinare la struttura del file DBF che deve accogliere i valori di un foglio di Excel. In X# non c'è una funzione analoga?
Grazie e buon lavoro!
​​​​​​​gfb
gfb
Post Reply