FPSpreadsheet
From Lazarus-ccr
The fpSpreadsheet library offers a convenient way to generate spreadsheet documents in various formats. The library is written in a very flexible manner, and is prepared to also support loading spreadsheet files in the future and can be easely extented to support more formats.
Contents |
[edit] Download
Not yet available
[edit] Subversion
svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/trunk/components/fpspreadsheet fpspreadsheet
[edit] Current Progress
[edit] License
The same modifyed LGPL as the Lazarus Component Library
[edit] Temporary stuff, soon to be removed
Because of it's very simple format, it's easy to generate Excel 2.1 files from code. New Excel versions are still capable of reading those files, so this can be enough to automate the generation of simple Excel files. Unfortunately Excel 4 and older formats don't support multiple sheets in the same file, so this isn't supported by this method.
Here is a unit which can write Excel 2.1 files:
{
excel2utils.pas
Writes an Excel 2.1 file
To write the file, always start calling StartExcel2File to create the Excel
file header, then call WriteExcel2Cell once for each cell value and finally
call EndExcel2File to write the end of the file.
License: The same modifyed LGPL as the Lazarus Component Library
AUTHORS: Felipe Monteiro de Carvalho
}
unit excel2utils;
{$ifdef fpc}
{$mode delphi}{$H+}
{$endif}
interface
uses
Classes, SysUtils;
const
STR_EXCEL_EXTENSION = '.xls';
procedure WriteExcel2Cell(AStream: TStream; const ACol, ARow: Word; const AValue: string);
procedure StartExcel2File(AStream: TStream);
procedure EndExcel2File(AStream: TStream);
implementation
procedure WriteExcel2Cell(AStream: TStream; const ACol, ARow: Word;
const AValue: string);
var
L: Word;
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
AStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
AStream.WriteBuffer(Pointer(AValue)^, L);
end;
procedure StartExcel2File(AStream: TStream);
var
CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
begin
AStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
end;
procedure EndExcel2File(AStream: TStream);
var
CXlsEof: array[0..1] of Word = ($0A, 00);
begin
AStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
end;
end.
And here is an example of how to use it:
{
excel2demo.dpr
Demonstrates how to write an Excel 2.1 file using the excel2utils unit
Public Domain
AUTHORS: Felipe Monteiro de Carvalho
}
program excel2demo;
{$mode delphi}{$H+}
uses
Classes, SysUtils;
var
OutputFile: TFileStream;
MyDir: string;
begin
// Open the output file
MyDir := ExtractFilePath(ParamStr(0));
OutputFile := TFileStream.Create(MyDir + 'test' + STR_EXCEL_EXTENSION, fmCreate or fmOpenWrite);
StartExcel2File(OutputFile);
// Write some cells
WriteExcel2Cell(OutputFile, 0, 0, '1');
WriteExcel2Cell(OutputFile, 1, 0, '2');
WriteExcel2Cell(OutputFile, 2, 0, '3');
WriteExcel2Cell(OutputFile, 3, 0, '4');
// Close the files
EndExcel2File(OutputFile);
OutputFile.Free;
end.
