Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

[Erledigt] SQLExpress und Excel 2007/2010

SQL Express von Boris Borzic

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

[Erledigt] SQLExpress und Excel 2007/2010

Beitrag von georg » Fr, 11. Okt 2013 11:00

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.
Zuletzt geändert von georg am Di, 15. Okt 2013 10:03, insgesamt 1-mal geändert.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13764
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLExpress und Office 2007/2010

Beitrag von brandelh » Fr, 11. Okt 2013 11:38

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.
Gruß
Hubert

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLExpress und Office 2007/2010

Beitrag von georg » Fr, 11. Okt 2013 12:03

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.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13764
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLExpress und Office 2007/2010

Beitrag von brandelh » Fr, 11. Okt 2013 13:00

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
Gruß
Hubert

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLExpress und Office 2007/2010

Beitrag von georg » Fr, 11. Okt 2013 17:08

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.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: SQLExpress und Office 2007/2010

Beitrag von Werner_Bayern » Fr, 11. Okt 2013 19:42

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.
es grüßt euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13764
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: SQLExpress und Office 2007/2010

Beitrag von brandelh » Sa, 12. Okt 2013 0:23

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 !
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10562
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: SQLExpress und Office 2007/2010

Beitrag von AUGE_OHR » Sa, 12. Okt 2013 1:37

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 )
gruss by OHR
Jimmy

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLExpress und Office 2007/2010

Beitrag von georg » Sa, 12. Okt 2013 6:49

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.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10562
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: SQLExpress und Office 2007/2010

Beitrag von AUGE_OHR » Sa, 12. Okt 2013 23:05

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 )
gruss by OHR
Jimmy

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: SQLExpress und Office 2007/2010

Beitrag von georg » Di, 15. Okt 2013 7:53

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.
Liebe Grüsse aus der Eifel,

Georg

Antworten