Einzelnen Beitrag anzeigen

Benutzerbild von fs999
fs999

Registriert seit: 4. Dez 2006
Ort: Luxembourg
46 Beiträge
 
Delphi 10.3 Rio
 
#33

Re: Excel - Export ohne Excel - Problem beim erzeugen

  Alt 11. Mai 2010, 08:47
Zitat von Chemiker:
Hallo alphaflight83,

in der CodeLib gibt es auch eine Unit um Excel-Dateien, ohne Excel zu erzeugen.

Excel-Unit
Bis bald Chemiker
Hallo Chemiker,

Ich habe eine kleine Änderung in deiner Excel-Unit gemacht um auch Zahlen einzugeben.

Delphi-Quellcode:
{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Unit:      XLSDateiUnit
letz.Ändr.: 11.06.2008
Version:    1.10
Funktion:  In diser Unit werden für das BIFF-Format die Records zur Verfügung
            gestellt.
            Änderungen für die Migration auf Delphi 2009 durchgeführt.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

unit XLSDateiUnit;

interface

uses Grids, Classes;

type
  TXLS_BOFRec= packed record // Start des Datenblockes
    RecCode: Word; // $809 BOF
    RecLaenge: Word; // Record Länge // Komplett 16/ normal 8
    BIFFVersion: Word; // $ 600 BiffVersions-Nummer:8
    Bereich: Word; // $10 = Workssheet
    ExcelVersion: Word; // muss nicht angegeben werden 2719=Excel 2000
    ExcelDatum: Word; // muss nicht angegeben werden
// ExcelHistoryFlag: DWord; // muss nicht angegeben werden
// LetzteExcelVersion: DWord; // muss nicht angegeben werden.
  end;

  TXLS_LABELRec= packed record // String-Record von Excel
    RecCode: Word; // $204 Bei Biff 8
    RecLaenge: Word; // Record Länge // muss zuvor berechnet werden
    Row: Word; // Zeilen-Nr. beginnt bei 0
    Col: Word; // Spalten-Nr. beginnt bei 0
    IndexXFRec: Word; // noch nicht ganz verstanden // erstmal=0
    ZellenStLeange: Word; // Nur die ZellenString-Länge
  end;
// FS999 Änderung
  TXLS_NUMBERRec= packed record // Number-Record von Excel
    RecCode: Word; // $203 Bei Biff 8
    RecLaenge: Word; // Record Länge // muss zuvor berechnet werden
    Row: Word; // Zeilen-Nr. beginnt bei 0
    Col: Word; // Spalten-Nr. beginnt bei 0
    IndexXFRec: Word; // noch nicht ganz verstanden // erstmal=0
  end;
// Ende
  TXLS_EOFRec= packed record // Ende des Datenblockes
    RecCode: Word; // $A0
    RecLaenge: Word; // 00 hat immer die Länge = 0
  end;

function XLS_BOFRecDatenFuellen(): TXLS_BOFRec;
// FS999 Ânderung
function XLS_FloatFuellen(const Zeile,Spalte: Word):TXLS_NUMBERRec;
// Ende
function XLS_StringFuellen(const Zeile,Spalte: Word; Wert: String):TXLS_LABELRec;
function XLS_EOFRecDatenFuellen(): TXLS_EOFRec;
function ZellenInhalt(Zeile, Spalte: Integer; Tab: TStringGrid): String;
function DatenInXLSDateiUebertragen(const XLS_LWPathDateiName: string;
                                    DatenStringGrid: TStringGrid): boolean;
implementation

uses
  SysUtils;

{------------------------------------------------------------------------------}
function XLS_BOFRecDatenFuellen(): TXLS_BOFRec;
begin
  with Result do
  begin
    RecCode:= $809;
    RecLaenge:= 8;
    BIFFVersion:= 1; // Kann auch 1 sein
    Bereich:= $10;
    ExcelVersion:= 1;
    ExcelDatum:= 0;
// ExcelHistoryFlag:=0;
// LetzteExcelVersion:=0;
  end;
end;
// FS999 Änderung
{------------------------------------------------------------------------------}
function XLS_FloatFuellen(const Zeile,Spalte: Word):TXLS_NUMBERRec;
begin
  with Result do
  begin
    RecCode:= $203;
    RecLaenge:= 14;
    Row:= Zeile;
    Col:= Spalte;
    IndexXFRec:= 0;
  end;
end;
// Ende
{------------------------------------------------------------------------------}
function XLS_StringFuellen(const Zeile,Spalte: Word; Wert: String):TXLS_LABELRec;
begin
  with Result do
  begin
    RecCode:= $204;
    RecLaenge:= 8 + (Length(Wert)*SizeOf(Char)); // Änderung für Delphi 2009
    Row:= Zeile;
    Col:= Spalte;
    IndexXFRec:= 0;
    ZellenStLeange:= (Length(Wert)*SizeOf(Char)); // Änderung für Delphi 2009
  end;
end;
{------------------------------------------------------------------------------}
function XLS_EOFRecDatenFuellen(): TXLS_EOFRec;
begin
  with Result do
  begin
    RecCode:= $A;
    RecLaenge:= 0;
  end;
end;
{------------------------------------------------------------------------------}
function ZellenInhalt(Zeile, Spalte: Integer; Tab: TStringGrid): String;
begin
  Result:= Tab.Cells [Spalte, Zeile];
end;
{------------------------------------------------------------------------------}
function DatenInXLSDateiUebertragen(const XLS_LWPathDateiName: string;
                                    DatenStringGrid: TStringGrid): boolean;
var
  x, i: integer;
  XLSFileStream: TFileStream;
  XLS_BOF: TXLS_BOFRec;
  XLS_EOF: TXLS_EOFRec;
  XLS_St: TXLS_LABELRec;
  Inhalt: String;
begin
  XLSFileStream:= TFileStream.Create(XLS_LWPathDateiName, fmCreate);
  Result:= FALSE;
  try
    // XLS-File Anfang schreiben
    XLS_BOF:= XLS_BOFRecDatenFuellen();
    XLSFileStream.WriteBuffer(XLS_BOF,SizeOf(XLS_BOFRecDatenFuellen()));

    // Werte aus einem StringGrid lesen und in die XLS-Datei eintragen
    for x := 0 to DatenStringGrid.ColCount - 1 do // Max. 254 Excel-Grenze
    begin
      for I := 0 to DatenStringGrid.RowCount - 1 do // Max 65536 Excel-Grenze
      begin
        Inhalt:= ZellenInhalt(I, x, DatenStringGrid);
        XLS_St:= XLS_StringFuellen(I, x, Inhalt);
        XLSFileStream.WriteBuffer(XLS_St, Sizeof (XLS_St));
        XLSFileStream.WriteBuffer(Inhalt[1], (Length(Inhalt)*SizeOf(Char))); // Änderung für Delphi 2009
      end;
    end;
    // Werte eintragen Ende.

    // XLS-File Ende schreiben
    XLS_EOF:= XLS_EOFRecDatenFuellen();
    XLSFileStream.WriteBuffer(XLS_EOF,SizeOf(XLS_EOFRecDatenFuellen()));
    Result:= TRUE;
  finally
    // Datei wieder schliesen.
    XLSFileStream.Free;
  end;
end;

end.
Um es zu benutzen :

Delphi-Quellcode:
Var
  ...
  XLS_Fl: TXLS_NUMBERRec;
  n: Double;
begin

  ...

  n := 5.42;
  XLS_Fl:= XLS_FloatFuellen(r, c);
  XLSFileStream.WriteBuffer(XLS_Fl, Sizeof(XLS_Fl));
  XLSFileStream.WriteBuffer(n, 8);

  ...

end;
Bis bald,
Frederic
  Mit Zitat antworten Zitat