{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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.