![]() |
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: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 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