Newsgroup: it.comp.lang.visual-basic
Titolo: VB6   Excel -> OpenOffice

Nel mio gestionale VB6 + Access prevedoin certi
punti di poter passare ad excel sfruttando
Microsoft Excel 9.0 object library.
 
Alcuni dei miei clienti abbandonano Excel per
utilizzare OpenOffice che è gratuito.
 
Quando mi dicono "il tuo programma non funziona più"
io rispondo che non può funzionare senza Excel.
Alla seconda domanda "non potresti ..." sono costretto
a rispondere che non posso.
 
Non credo esistano librerie che facciano "parlare"
VB6 con OpenOffice; e se mi sbagliassi?
 
Qualcuno di voi ha risolto in qualche modo?
 
Grazie e saluti.
Sauro 
 
 

Sauro ha detto questo venerdì :
zac
Tralascio le varie considerazioni filosofiche sul legarsi ad un oggetto 
COM deprecato da parecchi anni da Microsoft...avrai avuto i tuoi motivi
zac
 
VB6
file di esportazione->SW
 
credo che il csv sia supportato anche da openoffice!
 
Occhio che ora si cambia ancora in ambito OpenSource
LibreOffice è il fighetto di turno!
per il semplice motivo che openoffice se l'è pappato Oracle e offre una 
versione a pagamento!
 
-- 
----- Italliaaaaa 3227! -----
Che giovano a quell'uomo ottant'anni passati senza far niente?... 
Costui non è vissuto, ma si è attardato nella vita; né è morto 
tardi,... ma ha impiegato molto tempo per morire!
 
Lucio Anneo Seneca
 
 

versione a pagamento!
 
Sei rimasto indietro,  O_O è stato ceduto da Oracle ad Apache Foundation, che
sta ancora annegando in problemi di licenze, comunque la versione stabile di
OpenOffice 3.3 è ancora liberamente scaricabile dal sito, in attesa della prima
versione gestita da Apache.
 
http://it.openoffice.org/download/3.3.0/download330.html
 
 
 
 
--
ciao
  Stefano

VB6 con OpenOffice; e se mi sbagliassi?
 
Esistono, O_O si interfaccia facilmente con VB6
 
Ho postato del codice in passato, 
 
http://goo.gl/p6HqD
 
 
http://goo.gl/lB7bh
 
 
http://goo.gl/TGHbH
 
 
qui trovi documentazione sulle APi di OO
 
http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide
 
 
 
 
--
ciao
  Stefano


 
Già utilizzare librerie di una determinata versione
di Excel non è il massimo.
E se poi *smollano* anche Open Office e passano ad altro?
 
Se(se) il contesto non è ben determinato, XML, CSV o TXT.
 
-- 
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
 
http://www.maurogsc.eu/
 
 
 


zac
 
Ubuntu Mandrivia e via andare hanno di default LibreOffice adesso!!!
almeno i cd che trovi in edicola ti danno ancora openoffice ma lo devi 
cercare! di default c'hanno tutti LibreOffice....ce l'ho qui davanti il 
dvd!
Il perchï¿œ ï¿œ presto detto....stanno a fare un casino con il software 
libero!!!....quello che non ï¿œ riuscito a fare a zioBill...comprano le 
azinde e lo fanno diventare pian piano closed source!!!Oppure fermano 
lo sviluppo!
Virtualbox docet!
 
-- 
----- Italliaaaaa 3227! -----
Io sono Attila:
A come atrocitï¿œ,
doppia T come terremoto e tragedia,
I come ira di dio,
L come laco ti sangue
e A come adesso vengo e ti sfascio le corna!
(Diego Abatantuono "Attila Flagello di Dio")
 
 

Virtualbox docet!
 
Virtualbox è ancora Oracle, e si può ancora scaricare gratis, altrimenti ci sono
sempre le versioni free di VmWare.
 
Non essere così pessimista, il sw libero non se la passa benissimo, ma ha ancora
futuro, almeno lo spero    ;-)
 
--
ciao
  Stefano

 futuro, almeno lo spero    ;-)
 
 
L'esempio di OOo / LiBo è un esempio di cosa è il Software Libero.
Oracle si compra Sun e dopo un primo tentativo di "far soldi" si rende 
conto che non può (o non ci riesce) e decide di abbandonare OOo.
La comunità, con TFD al capo, prende il codice sorgente (e con LiBo TDF 
lo ha fatto molto prima dell'abbandono di OOo da parte di Oracle), e ne 
fa uscire un prodotto che, anche se con qualche problemino, è 
sicuramente utilizzabile anche per *Lavoro*
 
 
 
-- 
Daniele Pinna  (leva oops. per rispondere)
Utente Skype: dapinna
Sito Web: 
http://www.dapinna.com
 
Il Docfa in Pillole:  
http://www.ildocfainpillole.it
 
DAPINNA.COM
 su Facebook: 
www.facebook.com/pages/Sassari-Italy/DAPINNACOM/110085322371199
 
-----
** Now Powered by Linux KUbuntu 11.10 "Oneric Ocelot" **
 

 versione a pagamento!
 
In realtà Oracle ha cambiato il nome a quello che era prima Star Office 
che era già una versione a pagamento (che non si cagava nessuno).
Oracle ha fatto la "furba" e ha cambiato il nome di "Star Office" in 
"Oracle Open Office" cercando di far credere ai più che OpenOffice.org 
fosse diventato a pagamento... e molti ci sono cascati e forse qualcuno 
lo ha pure acquistato.


 VB6 con OpenOffice; e se mi sbagliassi?
 
Per essere possibile ï¿œ possibile, qui trovi degli esempi pratici:
 
http://www.kalitech.fr/clients/doc/VB_APIOOo_en.html
 
 
Perï¿œ devi considerare che OOo/LibO sono multipiattaforma e utilizzano un 
framework multipiattaforma che si chiama UNO (Universal Network Objects) 
che non ï¿œ in alcun modo compatibile con le librerie di MS Office.
OOo/LibO *non* sono cloni di MS Office, quindi si usano e si programmano 
in modo diverso.
 
-- 
Saluti
VITRIOL

 di OpenOffice.org dico però che secondo me esagera un pochino:-)
 
Solo pochissimissimo :-P
 
-- 
Saluti
VITRIOL


:-)


 Ma è comunque un Errore di MS Excel.
 
E con altri programmi MS funziona allo stesso modo...
 
In questo momento sto importando la rubrica del vecchio cellulare di mio 
padre in un altro cellulare "temporaneo".
 
Dal primo cellulare (marca LG) ho esportato creando un file .CSV (con 
virgole).
 
Il secondo cellulare (marca Nokia) nonostante le mega migliaia di 
funzioni di OVI, non ha l'importazione da file .CSV e quindi devo 
passare tramite MS OutLook Express...
Seleziono il file .CSV e mi vede tutti i campi come uno solo 
lunghissimo... e quindi vado a modificare tutte le "," in ";"
(ovviamente dopo aver verificato la non presenza di caratteri ";").


 Qualcuno di voi ha risolto in qualche modo?
 
Ciao,
hai 3 vie:
 
Esportazione XLS: usi la libreria open source MyXLS (
http://sourceforge.net/projects/myxls/
)
Esportazione XLS xml 2003: ti fai una bella routine che esporta in XML. Qui un ottimo esempio che ti consente di tenere sotto controllo l'esportazione: 
http://www.dotnetspider.com/resources/3103-Generating-Excel-sheet-using-Excel-XML.aspx
 ma ce ne sono davvero tanti altri
Esportazione XLSX: usi OpenXML SDK 2.0 o un wrapper open source come ClosedXML (
http://closedxml.codeplex.com/
).
 
Tutti e trw i casi ti svincolano dall'avere Excel, Openoffice o altre programmi installati sul pc.
 
Nicola

Ho cannato... non ho pensato che sei su VB6.
Nel tuo caso, l'unica soluzione che mi viene in mente è la seconda (quella di excelxlm)
 
Ti incollo una funzione che mi sono creato qualche tempo fa.
Parti da questa e poi espandi come vuoi.
 
Public Function ExportToExcel(ByRef rs As Recordset, ByVal filename As String, ByVal Testata As Boolean) As String
 
    On Error GoTo err
    Dim rowCount As Long
    Dim sheetcount As Integer
 
 
    Dim startExcelXML As String
 
    startExcelXML = "<?xml version=""1.0""?>" & vbCrLf & _
            "<?mso-application progid=""Excel.Sheet""?>" & vbCrLf & _
            "<Workbook " & "xmlns=""urn:schemas-microsoft-com:office:spreadsheet""" & vbCrLf & _
            " xmlns:o=""urn:schemas-microsoft-com:office:office""" & vbCrLf & _
            " xmlns:x=""urn:schemas-microsoft-com:office:" & "excel""" & vbCrLf & _
            " xmlns:ss=""urn:schemas-microsoft-com:" & "office:spreadsheet"">" & vbCrLf & _
            " <Styles>" & vbCrLf & _
            "  <Style ss:ID=""Default"" ss:Name=""Normal"">" & vbCrLf & _
            " <Alignment ss:Vertical=""Bottom""/>" & vbCrLf & _
            " <Borders/>" & vbCrLf & _
            " <Font ss:FontName=""MS Sans Serif""/>" & vbCrLf & _
            " <Interior/><NumberFormat/><Protection/>" & vbCrLf & _
            " </Style>" & vbCrLf & _
            "<Style ss:ID=""BoldColumn"">" & vbCrLf & _
            " <Font x:Family=""Swiss"" ss:Bold=""1""/>" & vbCrLf & _
            " </Style>" & vbCrLf
 
    startExcelXML = startExcelXML & "<Style ss:ID=""StringLiteral"">" & vbCrLf & _
            " <NumberFormat" & " ss:Format=""@""/>" & vbCrLf & _
            " </Style>" & vbCrLf & _
            " <Style ss:ID=""Decimal"">" & vbCrLf & _
            " <NumberFormat ss:Format=""0.0000""/>" & vbCrLf & _
            " </Style>" & vbCrLf & _
            " " & "<Style ss:ID=""Integer"">" & vbCrLf & _
            " <NumberFormat ss:Format=""0""/>" & vbCrLf & _
            " </Style>" & vbCrLf & _
            " <Style ss:ID=""DateLiteral"">" & vbCrLf & _
            " <NumberFormat ss:Format=""mm/dd/yyyy;@""/>" & vbCrLf & _
            " </Style>" & vbCrLf & _
            " <Style ss:ID=""NomiColonne"">" & vbCrLf & _
            "  <Borders>" & vbCrLf & _
            "   <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>" & vbCrLf & _
            "   <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>" & vbCrLf & _
            "   <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>" & vbCrLf & _
            "   <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>" & vbCrLf & _
            "  </Borders>" & vbCrLf & _
            " <Font ss:FontName=""Tahoma"" x:Family=""Swiss"" ss:Size=""9"" ss:Bold=""1""/>" & vbCrLf & _
            " <Interior ss:Color=""#C0C0C0"" ss:Pattern=""Solid""/>" & vbCrLf & _
            " <NumberFormat/>" & vbCrLf & _
            " </Style>" & vbCrLf & _
            " " & "</Styles>" & vbCrLf
 
    Dim endExcelXML As String
    endExcelXML = "</Workbook>"
 
    Dim NFile As Integer
    NFile = FreeFile
 
    Open filename For Output As #NFile
 
    Print #NFile, startExcelXML
    Print #NFile, "<Worksheet ss:Name=""Sheet" & CStr(sheetcount) & """>"
    Print #NFile, "<Table>"
    'Creo la testata
    If Testata = True Then
 
        'Seconda riga contiene il numero di righe estratte
        Print #NFile, "<Row ss:Index=""2"">" & vbCrLf
        Print #NFile, "<Cell ss:StyleID=""BoldColumn""><Data ss:Type=""String"">"
        Print #NFile, "Risultati: " & _
                       rs.RecordCount & " Righe</Data></Cell>"
        Print #NFile, "</Row>"
 
    End If
 
    'Riga con i nomi delle colonne
    Print #NFile, "<Row ss:Index=""4"">" & vbCrLf
    Dim x As Long
    For x = 0 To rs.Fields.Count - 1
        Print #NFile, "<Cell ss:StyleID=""NomiColonne""><Data ss:Type=""String"">"
        Print #NFile, rs.Fields(x).Name
        Print #NFile, "</Data></Cell>"
    Next
    Print #NFile, "</Row>"
 
    Dim XMLstring As String
 
    rowCount = 0
    sheetcount = 0
 
    rs.MoveFirst
 
    Do While Not rs.EOF
        rowCount = rowCount + 1
        'if the number of rows is > 64000 create a new page to continue output
 
        If rowCount = 64000 Then
            rowCount = 0
            sheetcount = sheetcount + 1
            Print #NFile, "</Table>"
 
            Print #NFile, "<WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel"">"
            Print #NFile, "<DoNotDisplayGridlines/>"
            If sheetcount = 0 Then
                'metto la testata solo sul primo foglio
                Print #NFile, "<FreezePanes/>"
                Print #NFile, "<SplitHorizontal>4</SplitHorizontal>"
                Print #NFile, "<TopRowBottomPane>4</TopRowBottomPane>"
                Print #NFile, "<ActivePane>2</ActivePane>"
            End If
            Print #NFile, "</WorksheetOptions>"
            Print #NFile, " </Worksheet>"
 
            Print #NFile, "<Worksheet ss:Name=""Sheet" & CStr(sheetcount) & """>"
            Print #NFile, "<Table>"
        End If
        Print #NFile, "<Row>"
 
        Dim Y As Long
        For Y = 0 To rs.Fields.Count - 1
            If IsNull(rs(Y)) Then
                'E' un NULL, scrivo una stringa vuota
                XMLstring = "<Cell ss:StyleID=""StringLiteral""><Data ss:Type=""String"">"
                XMLstring = XMLstring & "</Data></Cell>"
                Print #NFile, XMLstring
            Else
                Dim rowType As DataTypeEnum
                rowType = rs(Y).Type
                Select Case rowType
                    Case adVarChar, adVarWChar
                        XMLstring = CStr(rs(Y))
                        XMLstring = Trim(XMLstring)
 
                        'simboli propri dell'XML
                        XMLstring = Replace(XMLstring, "&", "&amp;")
                        XMLstring = Replace(XMLstring, ">", "&gt;")
                        XMLstring = Replace(XMLstring, "<", "&lt;")
 
                        'Lettere accentate
                        XMLstring = Replace(XMLstring, "à", "&agrave;")
                        XMLstring = Replace(XMLstring, "á", "&aacute;")
                        XMLstring = Replace(XMLstring, "è", "&egrave;")
                        XMLstring = Replace(XMLstring, "é", "&eacute;")
                        XMLstring = Replace(XMLstring, "ì", "&igrave;")
                        XMLstring = Replace(XMLstring, "í", "&iacute;")
                        XMLstring = Replace(XMLstring, "ò", "&ograve;")
                        XMLstring = Replace(XMLstring, "ó", "&oacute;")
                        XMLstring = Replace(XMLstring, "ù", "&ugrave;")
                        XMLstring = Replace(XMLstring, "ú", "&uacute;")
 
                        XMLstring = "<Cell ss:StyleID=""StringLiteral"">" & "<Data ss:Type=""String"">" & _
                                    XMLstring & "</Data></Cell>"
                        Print #NFile, XMLstring
                    Case adDBDate, adDBTime, adDBTimeStamp
                        'Excel has a specific Date Format of YYYY-MM-DD followed by
 
                        'the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
 
                        'The Following Code puts the date stored in XMLDate
 
                        'to the format above
 
                        Dim XMLDate As Date
                        Dim XMLDatetoString As String
 
                        XMLDate = CDate(rs(Y))
                        XMLDatetoString = ""
 
                        'Excel Converted Date
                        XMLDatetoString = CStr(Year(XMLDate)) & "-" & IIf(Month(XMLDate) < 10, "0" & CStr(Month(XMLDate)), _
                        CStr(Month(XMLDate))) & "-" & IIf(Day(XMLDate) < 10, "0" & CStr(Day(XMLDate)), _
                        CStr(Day(XMLDate))) & "T" & IIf(Hour(XMLDate) < 10, "0" & CStr(Hour(XMLDate)), _
                        CStr(Hour(XMLDate))) & ":" & IIf(Minute(XMLDate) < 10, "0" & CStr(Minute(XMLDate)), _
                        CStr(Minute(XMLDate))) & ":" & IIf(Second(XMLDate) < 10, "0" & CStr(Second(XMLDate)), _
                        CStr(Second(XMLDate))) & ".000"
 
                        XMLstring = "<Cell ss:StyleID=""DateLiteral""><Data ss:Type=""DateTime"">"
                        XMLstring = XMLstring & XMLDatetoString
                        XMLstring = XMLstring & "</Data></Cell>"
 
                        Print #NFile, XMLstring
 
                    Case adBoolean
                        XMLstring = "<Cell ss:StyleID=""StringLiteral""><Data ss:Type=""String"">"
                        XMLstring = XMLstring & CStr(rs(Y))
                        XMLstring = XMLstring & "</Data></Cell>"
 
                        Print #NFile, XMLstring
 
                    Case adInteger, adSmallInt, adTinyInt
                        XMLstring = "<Cell ss:StyleID=""Integer""><Data ss:Type=""Number"">"
                        XMLstring = XMLstring & Replace(CStr(rs(Y)), ",", ".")
                        XMLstring = XMLstring & "</Data></Cell>"
 
                        Print #NFile, XMLstring
 
                    Case adDecimal, adDouble, adSingle
                        XMLstring = "<Cell ss:StyleID=""Decimal""><Data ss:Type=""Number"">"
                        XMLstring = XMLstring & Replace(CStr(rs(Y)), ",", ".")
                        XMLstring = XMLstring & "</Data></Cell>"
 
                        Print #NFile, XMLstring
 
                    Case adEmpty
                        XMLstring = "<Cell ss:StyleID=""StringLiteral""><Data ss:Type=""String"">"
                        XMLstring = XMLstring & "</Data></Cell>"
 
                        Print #NFile, XMLstring
 
                    Case Else
 
                        XMLstring = "<Cell ss:StyleID=""StringLiteral""><Data ss:Type=""String"">"
                        XMLstring = XMLstring & "</Data></Cell>"
 
                        Print #NFile, XMLstring
                End Select
            End If
        Next
        Print #NFile, "</Row>"
 
        rs.MoveNext
    Loop
    Print #NFile, "</Table>"
 
 
    Print #NFile, "<WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel"">"
    Print #NFile, "<DoNotDisplayGridlines/>"
    If sheetcount = 0 Then
        'metto la testata solo sul primo foglio
        Print #NFile, "<FreezePanes/>"
        Print #NFile, "<SplitHorizontal>4</SplitHorizontal>"
        Print #NFile, "<TopRowBottomPane>4</TopRowBottomPane>"
        Print #NFile, "<ActivePane>2</ActivePane>"
    End If
    Print #NFile, "</WorksheetOptions>"
 
    Print #NFile, " </Worksheet>"
 
    Print #NFile, endExcelXML
 
    Close #NFile
 
    ExportToExcel = "+OK Esportazione in Excel completata."
 
    Exit Function
 
err:
 
    ExportToExcel = err.Description
 
 
End Function

[cut]
 
Ciao Nicola e grazie.
 
E' un po' complicata per me.
 
Mi servirebbe un esempio per OPenOffice.
 
1) Aprire una pagina vuota senza nome file
 
2) Nella prima riga scrivere "Titolo" poi
     una stringa nella seconda cella
3) Nella seconda riga scrivere "Numero" poi
    un double nella seconda cella
4) Nella terza riga scrivere "Data" poi una
    data nelle seconda cella.
5) Fine esempio
 
Se non è di troppo disturbo ....
 
Grazie e saluti.
 
Sauro 
 
 

 E' un po' complicata per me.
 
Qui hai tutto e non ti serve OpenOffice o Excel.
 
Prendi la funzione così com'è, gli passi un recordset con i dati che preferisci, il percorso in cui salvare il file (compreso il nome del file) ed infine un booleano true/false per stampare la testata oppure no (è una cosa che serviva a me, però ti viene utile per sapere il numero di record estratti) e fa tutto la funzione... anche dividere in più fogli excel se vi sono più di 64000 righe nel recordset.
 
E' davvero semplice, anche tenendo conto del fatto che è ben commentata.
 
Nicola
 

 
Nicola Ottomano ha scritto

Provato ma non mi funziona.
Non da errori ma il file risulta quasi completamente vuoto.
Ci sono i titoli poi sotto solo qualche numero (4 4 2)
 
Forse quei ? che ci sono nella routine dovrebbero
essere cambiati con qualcosa?
 
Comunque il fatto che richiedesse obbligatoriamente
un dataset non era il massimo per le mie esigenze.
 
Fa niente Nicola.
Grazie e saluti
 
 
 
 

 Qualcuno di voi ha risolto in qualche modo?
 
Senza svenarti troppo salvi in testo e tabulazione, chiami il file NOME.XLS
e fai una shell execute che si apre con quello che deve.
Non puoi decidere grassetti, formati ecc, ma qualcosa esporta.

 Se non è di troppo disturbo ....
 
http://www.oooforum.org/forum/viewtopic.phtml?p=237511#237511
 

 
"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel 
messaggio news:p2hjle5le2hc$.dbpr8b1iiom5.dlg@40tude.net...

Grazie Andrea
 
Sauro 
 
 

 
http://www.oooforum.org/forum/viewtopic.phtml?p=237511#237511
 
 
E'  proprio quello che mi serviva
 
Grazie ancora
 
Sauro