![]() |
Datenbank: MS SQL • Version: 2008 • Zugriff über: ADO
Excel generieren ohne Office
Hallo zusammen,
ich habe ein Programm geschrieben, mit dem man ein vorhandenes Excel öffnet und dort die Zellen füllt. Dies passiert zur Zeit über
Delphi-Quellcode:
.
XLApplication := CreateOleObject('Excel.Application');
Gibt es eine andere Möglichkeit das zu realisieren ohne dass Office benötigt wird??? Danke und Gruß,Moony |
AW: Excel generieren ohne Office
|
AW: Excel generieren ohne Office
ja mit z.B:
![]() |
AW: Excel generieren ohne Office
hallo,
das geht auch ohne Zusatz.
Delphi-Quellcode:
Gruss
const
{$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-} CXlsEof: array[0..1] of Word = ($0A, 00); //////////////////////////////////////////////////////////////////////////////// procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word; const AValue: Double); const {$J+} CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0); {$J-} begin CXlsNumber[2] := ARow; CXlsNumber[3] := ACol; XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber)); XlsStream.WriteBuffer(AValue, 8); end; //////////////////////////////////////////////////////////////////////////////// procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string); var L : Word; const {$J+} CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0); {$J-} begin L := Length(AValue); CXlsLabel[1] := 8 + L; CXlsLabel[2] := ARow; CXlsLabel[3] := ACol; CXlsLabel[5] := L; XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel)); XlsStream.WriteBuffer(Pointer(AValue)^, L); end; //////////////////////////////////////////////////////////////////////////////// procedure XlsWriteVal(XLsStream:TStream; Const ERow , ECol :word;Field:TField); var S : String; N : Extended; D : TDateTime; Begin N := 50000; S := ''; D := 0; case field.DataType of ftUnknown : S:='UNKNOWN'; ftString : S:=Field.asstring; ftSmallint : N:=Field.asfloat; ftInteger : N:=Field.asfloat; ftWord : N:=Field.asfloat; ftBoolean : S:=Field.asstring; ftFloat : N:=Field.asfloat; ftCurrency : N:=Field.asfloat; ftBCD : N:=Field.asfloat; ftDate : N:=Field.AsFloat; ftTime : N:=Field.AsFloat; ftDateTime : D:=Field.AsDateTime; ftBytes : S:='BYTES'; ftVarBytes : S:='VARBYTES'; ftAutoInc : N:=Field.asfloat; ftBlob : S:='BLOB'; ftMemo : S:=field.AsString; ftGraphic : S:='GRAPHIC'; ftFmtMemo : S:='FMTMEMO'; ftParadoxOle : S:='PARADOXOLE'; ftDBaseOle : S:='DBASEOLE'; ftTypedBinary: S:='TYPEBIN'; ftCursor : S:='CURSOR'; ftFixedChar : S:=field.asstring; ftWideString : S:=field.asstring; ftLargeInt : N:=Field.asfloat; ftADT : S:='ADT'; ftArray : S:='ARRAY'; ftReference : S:='REFER'; ftDataSet : S:='DATASET'; ftOraBlob : S:='ORABBLOB '; ftOraClob : S:='ORACCBLOB '; ftVariant : S:=field.asstring; ftInterface : S:='INTERFACE'; ftIDispatch : S:='IDISPATCH'; ftGuid : S:='GUID'; end; if N <> 50000 then // auch nuller XlsWriteCellNumber(XLsStream, ERow, ECol, N); if S <> '' then XlsWriteCellLabel(XLsStream, ERow, ECol, S); if D <> 0 then XlsWriteCellNumber(XLsStream, ERow, ECol, D) end; //////////////////////////////////////////////////////////////////////////////// function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean; var FStream: TFileStream; I, J: Integer; begin Result := False; FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite); try CXlsBof[4] := 0; FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); for i := 0 to AGrid.ColCount - 1 do begin for j := 0 to AGrid.RowCount - 1 do begin try XlsWriteCellNumber(FStream, I, J, strtofloat(AGrid.cells[i, j])); except XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]); end; end; end; FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); Result := True; finally FStream.Free; end; end; //////////////////////////////////////////////////////////////////////////////// procedure dbtoXLS(data : TDataset; AFileName : String); var BOOKm : pointer; i : integer; FStream : TFileStream; begin if not data.active then exit; BOOKm:=DATA.GetBookmark; data.DisableControls; data.first; FStream := TFileStream.Create(AFileName, fmCreate); try CXlsBof[4] := 0; FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); for i:=0 to Data.FieldCount-1 do XlsWriteCellLabel(FStream, i, 0 , data.fields[i].FieldName); while not DATA.Eof do begin for i:=0 to Data.fieldcount-1 do XlsWriteVal(FStream,i , data.recno , Data.Fields[i]); data.NEXT; end; FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); finally data.GotoBookmark(BOOKm); data.EnableControls; FStream.Free; end; end; Peter |
AW: Excel generieren ohne Office
Danke, ich werd das mal umsetzen...
|
AW: Excel generieren ohne Office
Hallo,
das Thema Excel-Files ohne Excel zu erzeugen scheint immer wieder hier im Forum hochzukommen, daher habe ich ich entschieden eine DLL (Usbiff8.dll) und eine dazugehörige Unit (UXLS.pas) hier zu veröffentlichen, welche dies ermöglichen. Die Datei Beschreibung.txt enthält eine Beschreibung der Funktionen und Eigenschaften. Zusätzlich ist noch eine Unit (Unit1.pas) angehängt, welche als Demoprojekt dient. Bitte ein Label und einen Button auf das Form ziehen. Ich habe die DLL selbst erstellt, daher verbleiben die Urheberrechte bei mir. Es kann jedoch jeder die DLL völlig frei benutzen. Die DLL wurde unter folgenden Betriebssystemen getestet: WIN 98, WIN 2000, XP, VISTA (32Bit, 64Bit), WIN 7 (32Bit, 64Bit) Die erstellten Excel Dateien wurden mit Microsoft Office (97-2010), Planmaker Office, Kingsoft Office, Open Office und Gnumeric getestet. Es existieren folgende Haupt-Restriktionen: Es können keine Charts und keine Pictures erzeugt werden. Ebenso können keine Formeln eingegeben werden. (Ich habe mit der Implementierung von Charts begonnen, sie aber nicht beendet, daher bitte die entsprechenden Befehle nicht aufrufen. Sie sind noch in der DLL und UXLS.pas vorhanden.) |
AW: Excel generieren ohne Office
PChar ist ein sehr ungünstiger Exporttyp.
Ich empfehle dringend auf PAnsiChar zu ändern, da die DLL ja mit Delphi 7 erstellt wurde und die DLL demnach als PAnsiChar deklariert wurde. Zitat:
Und eigentlich ist die Übergabe von Objekten, über die DLL-Grenzen hinweg, sowieso keine soooo gute Idee. |
AW: Excel generieren ohne Office
Zitat:
Zitat:
|
AW: Excel generieren ohne Office
Zitat:
Mein Explorer wird nicht virtualisiert (das ist der Standard) und demnach zeigt er mir die C:\test1+1.xls nicht an. :zwinker: Bezüglich des Objektsharings: Mach aus dem Objekt ein Interface und gut ist es. PS: Das .Free kann nicht funktionieren, da hier der falsche Speichermanager angesprochen wird. (und PChar nicht vergessen oder auf WideString umsteigen) |
AW: Excel generieren ohne Office
Zitat:
Zitat:
Zitat:
Ausserdem habe ich 500 Excel Dateien in einer Schleife erzeugen lassen und konnte kein Speicherleck in der Anwendung finden :gruebel: |
AW: Excel generieren ohne Office
Mit Delphi 7 und wenn man alle Interfaces (virtuelle Methoden) nutzt und oder die Codeoptimierung deaktiviert ist, dann funktioniert es.
Ab Delphi 2009 muß man mit dem PChar aufpassen und sobald Delphi "nichtgenutzte" Methoden aus der VMT entfernt, dann stimmen die Indize der nachfolgenden Methoden nicht mehr und das war's dann > Exceptions wären das Mindeste. |
AW: Excel generieren ohne Office
Na gut Himitsu, du hast mich überredet! Ich habe die Interface-Proceduren so
angepasst, dass die Klasse innerhalb der DLL bleibt. Der Nachteil dieser Implementierung ist, dass jetzt von einer Application aus nicht gleichzeitig (parallel), sondern nur nacheinander mehrere Excel Dateien erzeugt werden können, da nur immer eine Instanz der Klasse angelegt sein kann (und zwar innerhalb der DLL). Ausserdem musste ich für jede Eigenschaft eine Procedure anlegen, die das Setzten (Ändern) ermöglicht. Das war aufwendiger als ich dachte. :( Natürlich hat sich durch die Änderung die Schnittstelle komplett geändert, sodass ich das Demoprojekt komplett überarbeiten musste. |
AW: Excel generieren ohne Office
Hallo,
ich musste die beiden Versionen der DLLs Usbiff8.dll und Usbiff8V2.dll updaten, da ab ca 8000 unterschiedlichen Strings in einem Excel-Dokument ein Record überlief. Ich habe beide DLLs und die beiden Demoapplikationen mit angehängt, es hat sich jedoch jeweils nur die DLL geändert. Viel Spaß beim testen! |
AW: Excel generieren ohne Office
Seit Office2007 setzt man aber auf das Office
![]() |
AW: Excel generieren ohne Office
Hallo,
ja das stimmt! Jedoch ist das xls-Dateiformat derzeit noch verbreiteter, daher habe ich mich entschieden dieses zunächt zu generieren. Meiner Meinung nach ist das Open XML Format eher einfacher zu implementieren als das Biff8 Format. |
AW: Excel generieren ohne Office
Ich habe eine XMLX und ODS Export Library geschrieben:
![]() |
AW: Excel generieren ohne Office
Ich habe das mal versucht, das klappt einwandfrei.
Wenn Man die Stringfelder umdefiniert als AnsiString, so gibt es auch mit Delphi XE2 keine Probleme. Jetzt habe ich noch 3 Fragen 1. Wie kann an eine bestehende Exceldatei angefügt werden 2. Wo finde ich Infos, zur Formattierung 3. Klappt das auch umgekehrt, so dass eine Datei eingelesen werden kann. Wa da jemand Infos hätte, wäre das echt Super!!!! :lol: |
AW: Excel generieren ohne Office
Hallo,
zu Deinen Fragen: 1) Es kann nichts an eine bestehende Excel Datei angefügt werden. Die Datei muss von von Grund auf erstellt werden. 2) Infos zum Biff8 Format sind in folgenden zwei Dateien enthalten, die man durch "googlen" im Internet findet: -MICROSOFT OFFICE EXCEL 97-2007 BINARY FILE FORMAT SPECIFICATION [*.xls (97-2007) format] -OpenOffice.org's Documentation of the Microsoft Excel File Format Excel Versions 2, 3, 4, 5, 95, 97, 2000, XP, 2003 In der DLL sind die wichtigsten und nötigsten Formate entsprechend diese beiden Dokumente implementiert. 3) Nein! Dazu muss die Datei im Biff8 Format analysiert werden. Ich habe das nicht in der DLL implementiert. |
AW: Excel generieren ohne Office
Noch ein kleiner Nachtrag:
Die mit Hilfe der oben genannten Dokumente erstellte Biff8 Datei muss dann noch in Micropsoft Compound File Format eingelabert werden. Dies geschieht gemäß dieses Dokuments: -OpenOffice.org's Documentation of the Microsoft Compound Document File Format Das Dokument kann ebenfalls durch "googeln" gefunden werden. MfG |
AW: Excel generieren ohne Office
Hallo,
ich habe beide DLL-Versionen erneut upgedated - Hauptänderungen: 1) Generierung von Exceldateien mit vielen Zeilen pro Arbeitsblatt geht erheblich schneller. 2) Es können sämtliche im System verfügbare Fonts verwendet werden. 3) Fehler wurde beseitigt, so dass auch "sehr große" Dateien erzeugt werden können 4) Interface wurde komplett auf PAnsiChar umgestellt, so dass sich die DLLs auch mit Unicode-fähigem Delphi nutzen lassen - Getestet wurden die DLLs mit D7, D2007 und XE2. Viel Spaß damit! |
AW: Excel generieren ohne Office
Nicht schlecht...:thumb:
Schau mal dieses Video an: ![]() Das nutze ich. Spart viel Zeit. Excel Tabelle öffnen und der Code ist fertschhhh.... |
AW: Excel generieren ohne Office
Ich hatte Flexcel mal ausprobiert und fast eingesetzt. Leider hat es in meinem Fall (sehr komplexes Sheet) versagt. Aber selbst eine Lösung von DevExpress hat das nicht hinbekommen. Ich hatte mir dann
![]() die Lösung von Axolotl besorgt. Ich würde aber zu Flexcel raten, weil es dann doch nicht so hingefrickelt ist, wie das Axolotl-Zeugs (das aber gut funktioniert, keine Frage). |
AW: Excel generieren ohne Office
Hallo,
wie kann ich ein € Zeichen ausgeben mit Hilfe der Dll von Marky522, habe schon alles versucht aber entweder kommt Unsinn raus oder ein Leerzeichen ? Grüße Michael |
AW: Excel generieren ohne Office
Hallo,
Excel kann zwar Unicode darstellen, doch habe ich das in der Dll nicht implementiert. Es gibt dennoch 2 Möglichkeiten ein €-Zeichen darzustellen: 1) Du verwendest die Formate -5 bis -8 oder -42 oder -44 je nachdem was Du willst (entsprechen Beträgen der Excel-Formaten) oder 2) Du verwendest einen Font der dieses Zeichen auch so darstellt, wenns sowas überhaubt gibt? |
AW: Excel generieren ohne Office
Hallo,
kannst du mir mal ein Beispiel zu Variante 1 zeigen, ich steh irgendwie auf dem Schlauch ? Grüße Michael |
AW: Excel generieren ohne Office
Hallo,
schau Dir bitte einfach mal das mitgelieferte Beispiel an - und da das Arbeitsblatt "Nummernformat" und den dazu gehörigen Quellcode in der Unit "Unit1.pas", der das Arbeitsblatt generiert. MfG Markus |
AW: Excel generieren ohne Office
So habe ich das auch versucht aber mit Libre Office scheint das nicht zu funktionieren.
Montag teste ich das mal auf Arbeit mit MS Office ob es da geht. Grüße Michael |
AW: Excel generieren ohne Office
Hallo,
also mit MS Office funktioniert das mit dem Eurozeichen einwandfrei , vielen dank. Grüße Michael |
AW: Excel generieren ohne Office
Hallo Michael,
dass das mit Libreoffice nicht funktioniert liegt vermutlich daran, dass ich gewisse Formatrecords nicht schreibe, da sie nicht zwingend geschrieben werden müssen. Da sowieso eine Überarbeitung der DLLs im Gang ist, habe ich nun einen Grund diese Records zu schreiben - dann sollte es auch mit Libreoffice und dem €-Zeichen funktionieren. MfG Markus |
AW: Excel generieren ohne Office
Hallo,
ich habe die beiden DLLs erneut "upgedated" mit folgenden Hauptänderungen: 1) Es können Zellen an bestehende Excel Dateien angehängt werden. 2) Es können Zellen aus bestehende Excel Dateien gelöscht werden. 3) Es können Zellen in bestehende Excel Dateien ersetzt werden. 4) Es können Excel Dateien eingelesen werden. Hinweis: Die DLLs können lediglich Biff8 Dateien verarbeiten (Excel 97-2003 Format). Bei Diagrammen, die in Arbeitsblättern eingelagert sind, kann es beim Lesen und Reproduzieren der Dateien zu Problemen kommen - die gilt nicht für Diagramm-Arbeitsblätter, diese werden einfach überlesen. Die DLLs können nur die Funktionen einlesen und reproduzieren, die sie selbst auch schreiben können, also keine Formeln, keine Diagramme, keine Bilder, keine Macros... An Michael "Jick": Die Formatrecords werden jetzt geschrieben, somit sollte es mit Libreoffice und dem €-Zeichen jetzt auch klappen. Mfg Markus |
AW: Excel generieren ohne Office
Hallo Markus,
funktioniert jetzt super mit Libre Office, danke. Grüße Michael |
AW: Excel generieren ohne Office
Auch nochmal ein Danke von meiner Seiter :) Funktioniert super :)
|
AW: Excel generieren ohne Office
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
vielen Dank! Es freunt mich, zu sehen, dass die DLLs auch von jemandem genutzt werden! :) Mittlerweile habe ich die DLLs Usbiff8.dll und Usbiff8V2.dll erneut "upgedated": 1) Die Read-Proceduren der DLL wurden erweitert und vereinfacht. 2) Es sollte jetzt keine Probleme mehr geben, falls Diagramme in Arbeitsblättern eingelagert sind. 3) Es ist nun beim Beschreiben von Zellen möglich, deren Format (Farbe, Rahmen, Font...ect.) beizubehalten. Die restlichen Hinweise des letzten Updates gelten weiterhin. Viel Spaß mit den DLLs! MfG Markus |
AW: Excel generieren ohne Office
Hallo,
Zur Information,ich habe ein Projektthema hier im Forum erstellt, und die DLLs auch dort platziert. Mfg Markus |
AW: Excel generieren ohne Office
Hallo,
das Thema ist zwar schon ziemlich alt, aber für mich heute wichtig. Dabei interessiert mich vor allem, wie ich an eine existierende Excel-Datei weitere Zeilen anhängen kann. Zitat:
werden können, wieviel Zeilen die existierende Datei besitzt, bevor ich dann die nächste Zeile beschreiben kann. Vielen Dank und einen schönen Sonntag |
AW: Excel generieren ohne Office
Hallo delphinewbie,
bitte die Dateien in nachfolgendem Link verwenden, sie sind neuer: ![]() Wenn Du die procedure Create (Version 1) bzw. XLScreate (Version V2) mit Filemode xlsopenread oder xlsopenwrite öffnest, werden die Inhalte automatisch eingelesen. Mfg Markus |
AW: Excel generieren ohne Office
Hallo zusammen,
seit längerem benutze unter Delphi 5 und 7 den von tshubaka 2011 geposteten Code zum Export von Daten eines Grids in eine Excel-Tabelle, ohne dass Excel installiert ist (ich nutze LibreOffice). Hat prima geklappt. Unter Delphi 10.3 Rio (Community Edition) passiert folgendes: Zeilen und Spaltenanzahl passen, Integerwerte und Realzahlen werden korrekt exportiert, von Strings aber NUR genau der erste Buchstabe. Scheinbar funktioniert die procedure XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]); unter Delphi 10.3 nicht (mehr) wie gewünscht. Hat jemand eine Idee, an welcher Schraube ich (am Compiler) drehen muss? Mein Code compiliere ich mit {$H-}. Beste Grüße Hans-J. |
AW: Excel generieren ohne Office
Hallo, ich denke mal das hängt mit Unicode zusammen.
Schau mal nach wie Strings geschrieben werden. |
AW: Excel generieren ohne Office
Das war's!
Vorher: procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string); Nachher: procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: ansistring); Besten Dank und Grüße Hans-J. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz