Seite 1 von 1

[Erledigt] SQLExpress und Excel 2007/2010

Verfasst: Fr, 11. Okt 2013 11:00
von georg
Hallo,


es gelingt mir nicht, mit SQLExpress eine gültige XLSX-Ausgabedatei zu erstellen.

Code: Alles auswählen

   oConX := SQLConnection():new()
   cLine := "Driver={" + SQLUGetDriverName("EXCEL", oConX) + "};ReadOnly=0;MaxScanRows=0;FirstRowHasNames=1;FIL=excel 8.0;DBQ=" + cXFile + ";"
   IF !oConX:driverConnect(NIL, cLine)
      ConfirmBox(, "Could not connect to Excel file to export data", "Error", XBPMB_OK, XBPMB_CRITICAL)
      RETU(.F.)
   ENDIF
Dieser Code erstellt die Ausgabe-Datei, wenn sie nicht vorhanden ist. Zumindest bis Excel 2003 hat das funktioniert.

Da Office 2010 behauptet, Version 14 zu sein, habe ich es mit diesem Parameter versucht:

Code: Alles auswählen

FIL=excel 14.0;
Es wird eine Ausgabedatei erzeugt, die aber weder als .XLSX, noch als .XLS geöffnet werden kann. Excel behauptet in beiden Fällen, dass die Datei keine gültige Excel-Datei wäre.

Irgendwer eine gute Idee?

Ach so, ich habe den Report, um den es hier geht, zuerst mit OfficeAutomation erstellt, Laufzeit über 2 Stunden. Die SQLExpress-Variante brauchte keine 5 Minuten, nur sollte das Ziel halt eben XLSX sein.

Re: SQLExpress und Office 2007/2010

Verfasst: Fr, 11. Okt 2013 11:38
von brandelh
Zu deiner Frage kann ich dir nix sagen, aber ich liefere XLSX Dateien mit 100.000 Datensätzen, das dauert keine Minute.
Meine Daten liegen in einer DBF und es gibt ja ein Beispiel wie Excel eine DBF öffnet und eine XLS speichert ...
... du brauchst also nur noch die Daten in eine passende DBF zu packen.
Die Spaltenformatierung erledigt bei mir FormatExcelSheet(oBook:ActiveSheet)

Code: Alles auswählen

// Erzeugen eines "Excel.Application"-Objektes
oExcel := CreateObject("Excel.Application")
IF Empty( oExcel )
    MsgBox( "Excel ist nicht installiert" )
    RETURN
else
    if val(oExcel:version) < 12 // bei großen Dateien !
       MsgBox( "Excel 2007ff wird benötigt !" )
    endif
ENDIF

// Vermeiden von Nachrichten wie "Die Datei existiert bereits". Sicherstellen, dass die Excel-Anwendung sichtbar ist.
oExcel:DisplayAlerts := .F.
oExcel:visible       := .T.

... DBF erzeugen, vorbereiten ...

delete file (cDir+cExcel+".XLSX")
oBook := oExcel:workbooks:Open(cDir+aExcelExport[x]+".DBF")
FormatExcelSheet(oBook:ActiveSheet)
oBook:SaveAs( cDir+aExcelExport[x] , xlOpenXMLWorkbook )
oBook:close()
Das geht wirklich recht schnell, meine größte DBF war 250 MB, die XLSX daraus hat noch 65 MB.

Re: SQLExpress und Office 2007/2010

Verfasst: Fr, 11. Okt 2013 12:03
von georg
Hallo, Hubert -


was weiss ich, woran unsere Office-Installation möglicherweise krankt.

Mir geht es darum, mit SQLExpress eine Office 2007/2010 kompatible Excel-Datei zu erstellen. Das ich das mit OfficeAutomatioon kann, hatte ich - denke ich - bereits geschrieben.

Re: SQLExpress und Office 2007/2010

Verfasst: Fr, 11. Okt 2013 13:00
von brandelh
Hallo Georg,

du hattest geschrieben, dass das 5 Minuten gedauert hat (also wohl Zeile für Zeile ausfüllen ... LAHM) und ich dachte (in meinem Wahn), du könntest an einer schnelleren Lösung interessiert sein ... :badgrin:
Sorry, aber - wie oben schon bemerkt - kann ich zur SQLexpress Frage sonst nichts beitragen. :D

Re: SQLExpress und Office 2007/2010

Verfasst: Fr, 11. Okt 2013 17:08
von georg
Hallo, Hubert -


das Problem mit OfficeAutomation ist noch ein anderes. Im gleichen Programm erstelle ich ca. 50 Excel-Dateien (Low-Level Copy, Open, Erstellen, Close). Wenn diese Routine zwei, drei mal durchlaufen wird, habe ich (trotz :close() und :destroy()) 100 bis 150 Excel-Prozesse im Speicher. Diese werden zwar geschlossen, wenn das Programm beendet wird (kann man so auch in der Dokumentation zu AutomationObject() nachlesen) - aber genau dieses Problem habe ich mit SQLExpress nicht.

Re: SQLExpress und Office 2007/2010

Verfasst: Fr, 11. Okt 2013 19:42
von Werner_Bayern
Dazu kann ich eine Empfehlung abgeben:

http://www.libxl.com

Damit kann man Excel lesen und schreiben, ohne Excel! Und das sehr schnell! Setze es seit 1 Jahr in einem Tool ein, was früher 7-8 Stunden dauerte (Öffnen, Auslesen und Schreiben einer Ergebnisdatei von ca. 150 Excel-Dateien), dauert jetzt keine 30 Minuten.

Kann xls und xlsx.

Und der Support ist gut und schnell.

Re: SQLExpress und Office 2007/2010

Verfasst: Sa, 12. Okt 2013 0:23
von brandelh
Mein Programm erstellt etwa 20 Dateien, wobei es die eine Excel Instanz immer neu benutzt.
Im Speicher kann ich keine 20 Excelinstanzen finden ... aber die LIB sieht viel versprechend aus !

Re: SQLExpress und Office 2007/2010

Verfasst: Sa, 12. Okt 2013 1:37
von AUGE_OHR
georg hat geschrieben:Dieser Code erstellt die Ausgabe-Datei, wenn sie nicht vorhanden ist. Zumindest bis Excel 2003 hat das funktioniert.
...
Irgendwer eine gute Idee?
das geht doch über ODBC ?
und du arbeitest sicherlich auf einem 64bit OS()

... welche Version Office hast du ?
... welchen ODBC Treiber benutzt du ?

p.s. Xbase++ ActiveX Code läuft auch unter harbour und statt 5min dann 30sec. ( Faktor 30 - 40 je nach CallMethod )

Re: SQLExpress und Office 2007/2010

Verfasst: Sa, 12. Okt 2013 6:49
von georg
Hallo, Jimmy -


der betreffende Rechner läuft unter einem Windows 7 Pro, 32 bit. Eingesetzt wird Office 2010 mit dem dazugehörigen ODBC-Treiber.

Aber mich interessiert, ob das hier jemand schon umgesetzt hat. Das scheint aber - wenn ich mir so die Antworten durchlese - noch keiner gemacht zu haben.

Re: SQLExpress und Office 2007/2010

Verfasst: Sa, 12. Okt 2013 23:05
von AUGE_OHR
georg hat geschrieben:der betreffende Rechner läuft unter einem Windows 7 Pro, 32 bit. Eingesetzt wird Office 2010 mit dem dazugehörigen ODBC-Treiber.
ok ... bei 32bit "solltest" du Zugriff auf die richtigen ODBC Treiber haben.
georg hat geschrieben:Aber mich interessiert, ob das hier jemand schon umgesetzt hat. Das scheint aber - wenn ich mir so die Antworten durchlese - noch keiner gemacht zu haben.
im Zweifel Boris mal fragen. ( auch unter http://www.xbwin.com/forum.html -> SqlExpress )

Re: SQLExpress und Office 2007/2010

Verfasst: Di, 15. Okt 2013 7:53
von georg
Hallo,


ja, Boris wusste um die Ursache des Problems: der ODBC-Treiber erstellt eine .xlsb (binary) Datei, die unter diesem Namen auch einwandfrei geöffnet werden kann.