Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Excel generieren ohne Office (https://www.delphipraxis.net/164093-excel-generieren-ohne-office.html)

Moony 28. Okt 2011 10:23

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

taveuni 28. Okt 2011 10:26

AW: Excel generieren ohne Office
 
Wir machen's mit dem

Gibt aber auch anderes.

ibp 28. Okt 2011 10:36

AW: Excel generieren ohne Office
 
ja mit z.B: AdvStringGrid und AdvExcelIO von TMS Software geht das...

tshubaka 28. Okt 2011 14:23

AW: Excel generieren ohne Office
 
hallo,
das geht auch ohne Zusatz.
Delphi-Quellcode:
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;
Gruss
Peter

Moony 28. Okt 2011 15:17

AW: Excel generieren ohne Office
 
Danke, ich werd das mal umsetzen...

marky522 24. Dez 2011 09:20

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.)

himitsu 24. Dez 2011 09:34

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:

Die DLL wurde unter folgenden Betriebssystemen getestet: WIN 98, WIN 2000, XP, VISTA (32Bit, 64Bit),
WIN 7 (32Bit, 64Bit)
PS: Der Versuch eine Datei in C:\... zu erstellen kann seit Win7 (mit ordentlichen Benutzerrechten, bzw. mit aktivem UAC noch nie funktioniert haben. (eigentlich schon seit Win2000, mit Benutzerrechte ging das nicht ... Zugriff verweigert)

Und eigentlich ist die Übergabe von Objekten, über die DLL-Grenzen hinweg, sowieso keine soooo gute Idee.

marky522 24. Dez 2011 10:06

AW: Excel generieren ohne Office
 
Zitat:

PS: Der Versuch eine Datei in C:\... zu erstellen kann seit Win7 (mit ordentlichen Benutzerrechten, bzw. mit aktivem UAC noch nie funktioniert haben. (eigentlich schon seit Win2000, mit Benutzerrechte ging das nicht ... Zugriff verweigert)
Das ist ja nur ein Demoprojekt, welches die grundsätzliche Funktionsweise der DLL zeigen soll :wink:

Zitat:

Ich empfehle dringend auf PAnsiChar zu ändern, da die DLL ja mit Delphi 7 erstellt wurde und die DLL demnach als PAnsiChar deklariert wurde.

Diese Änderung kann von jedem bequem in der UXLS.pas vorgenommen werden.

himitsu 24. Dez 2011 10:30

AW: Excel generieren ohne Office
 
Zitat:

Zitat von marky522 (Beitrag 1142997)
Das ist ja nur ein Demoprojekt, welches die grundsätzliche Funktionsweise der DLL zeigen soll :wink:

Nur daß der Test nicht funktioniert und mir demnach auch nichts zeigen kann. :zwinker:
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)

marky522 24. Dez 2011 13:21

AW: Excel generieren ohne Office
 
Zitat:

Nur daß der Test nicht funktioniert und mir demnach auch nichts zeigen kann.
Mein Explorer wird nicht virtualisiert (das ist der Standard) und demnach zeigt er mir die C:\test1+1.xls nicht an.

Na da bin ich aber froh, dass du die Datei doch noch entdeckt hast:-D

Zitat:

Bezüglich des Objektsharings: Mach aus dem Objekt ein Interface und gut ist es.
Da die DLL so funktioniert, wie sie ist, habe ich eigentlich nicht vor sie zu ändern.

Zitat:

PS: Das .Free kann nicht funktionieren, da hier der falsche Speichermanager angesprochen wird.
Ich habe das genauso gemacht, wie in dem berühmten Beispiel einer Objekt-DLL von A. Kosch.
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 14:08 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz