FPSpreadsheet/de
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
polski (pl) │
русский (ru) │
Die fpSpreadsheet Bibliothek bietet einen praktischen Weg, Tabellenkalkulations-Dokumente in verschiedenen Formaten zu erzeugen und zu lesen. Die Bibliothek ist sehr flexibel gehalten und kann daher leicht erweitert werden, um weitere Formate zu unterstützen.
API Dokumentation
API Referenz
Eine Referenz im CHM-Format befindet sich hier:
http://lazarus-ccr.svn.sourceforge.net/viewvc/lazarus-ccr/components/fpspreadsheet/fpspreadsheet.chm
Formeln
Zwei Arten von Formeln werden von FPSpreadsheet unterstützt: String-Formeln und RPN-Formeln. String-Formeln werden als Zeichenketten geschrieben genau wie in der Office-Anwendung, zum Beispiel "ROUND(A1+B1)", während RPN-Formeln in Umgekehrter Polnischer Notation (Reverse Polish Notation) geschrieben werden, zum Beispiel: A1, B1, Add, 0, ROUND
RPN-Formeln
Verwendung einfacher konstanter Zahlen
<delphi> var
MyRPNFormula: TsRPNFormula;
begin
// Schreibt die Formel =4+5 MyWorksheet.WriteUTF8Text(3, 0, '=4+5'); // A4 // SetLength(MyRPNFormula, 3); MyRPNFormula[0].ElementKind := fekNum; MyRPNFormula[0].DoubleValue := 4.0; MyRPNFormula[1].ElementKind := fekNum; MyRPNFormula[1].DoubleValue := 5.0; MyRPNFormula[2].ElementKind := fekAdd; MyWorksheet.WriteRPNFormula(3, 2, MyRPNFormula);
end; </delphi>
Verwendung von Zellbereichen und des unären Operators SUM
<delphi>
// =Sum(E2:e5) MyWorksheet.WriteUTF8Text(1, 0, '=Sum(E2:e5)'); // A2 // SetLength(MyRPNFormula, 2); MyRPNFormula[0].ElementKind := fekCellRange; MyRPNFormula[0].Row := 1; MyRPNFormula[0].Row2 := 4; MyRPNFormula[0].Col := 4; MyRPNFormula[0].Col2 := 4; MyRPNFormula[1].ElementKind := fekOpSUM; MyWorksheet.WriteRPNFormula(1, 2, MyRPNFormula); // C2
</delphi>
Verwendung eingebauter Routinen
<delphi>
// Schreibt die Formel E1 = ABS(A1) SetLength(MyRPNFormula, 2); MyRPNFormula[0].ElementKind := fekCell; MyRPNFormula[0].Col := 0; MyRPNFormula[0].Row := 0; MyRPNFormula[1].ElementKind := fekABS; MyWorksheet.WriteRPNFormula(0, 4, MyRPNFormula);
// Schreibt die Formel F1 = ROUND(A1, 0) SetLength(MyRPNFormula, 3); MyRPNFormula[0].ElementKind := fekCell; MyRPNFormula[0].Col := 0; MyRPNFormula[0].Row := 0; MyRPNFormula[1].ElementKind := fekNum; MyRPNFormula[1].DoubleValue := 0.0; MyRPNFormula[2].ElementKind := fekROUND; MyWorksheet.WriteRPNFormula(0, 5, MyRPNFormula);
</delphi>
Eingebaute Routinen
ABS - Gibt den absoluten Wert einer Zahl zurück. Benötigt wird 1 Argument. Beispiel: ABS(-1) = 1
ROUND - Rundet eine Zahl auf eine bestimmte Anzahl von Dezimalstellen. Benötigt 2 Argumente, erstens die zu rundende Zahl und zweitens die Anzahl der Nachkommastellen. Dieses zweite Argument ist standardmäßig auf 0 gesetzt und kann auch negativ werden.
Packages
FPSpreadsheet ist zum vereinfachten Gebrauch in folgende zwei Packages aufgeteilt:
laz_fpspreadsheet.lpk
Fügt alle nötigen Dateien hinzu, um 'fpspreadsheet' in Ihren Lazarus-Projekten zu verwenden. Nachdem Sie dieses Package als Anforderung in Ihrem Projekt hinzugefügt haben, ergänzen Sie die uses-Klausel der betroffenen Units mit "fpspreadsheet".
laz_fpspreadsheet_visual.lpk
Stellt eine Reihe visueller Komponenten zur Verfügung, die die Möglichkeiten von FPSpreadsheet erweitern. Dazu gehört das Bearbeiten und Anzeigen von Daten aus Ihren LCL-Anwendungen heraus.
Die folgenden LCL Komponenten werden mit diesem Package installiert:
Beispiele
Erzeugen Sie ein Projekt das die fpspreadsheet-Bibliothek benutzt, indem Sie das fpspreadsheet_pkg Package zu Ihrem Lazarus-Projekt hinzufügen, oder geben Sie das Basisverzeichnis von fpspreadsheet in Ihren Compileroptionen an, wenn Sie eine andere IDE verwenden.
Excel 5 Beispiel
<delphi> { excel5demo.dpr
Demonstriert, wie man eine Excel 5.x Datei schreibt unter Verwendung der fpspreadsheet-Bibliothek.
Sie können das Ausgabe-Format festlegen indem Sie die Konstante OUTPUT_FORMAT ändern.
AUTOR: Felipe Monteiro de Carvalho } program excel5demo;
{$mode delphi}{$H+}
uses
Classes, SysUtils, fpspreadsheet, fpsallformats, fpspreadsheet_pkg;
const OUTPUT_FORMAT = sfExcel5;
var
MyWorkbook: TsWorkbook; MyWorksheet: TsWorksheet; MyFormula: TsRPNFormula; MyDir: string;
begin
// Initialisierung MyDir := ExtractFilePath(ParamStr(0));
// Create the spreadsheet MyWorkbook := TsWorkbook.Create; MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet');
// Write some number cells MyWorksheet.WriteNumber(0, 0, 1.0); MyWorksheet.WriteNumber(0, 1, 2.0); MyWorksheet.WriteNumber(0, 2, 3.0); MyWorksheet.WriteNumber(0, 3, 4.0);
// Schreibt die Formel E1 = A1 + B1 // oder, in RPN: A1, B1, + SetLength(MyFormula, 3); MyFormula[0].ElementKind:=fekCell; {A1} MyFormula[0].Col := 0; MyFormula[0].Row := 0; MyFormula[1].ElementKind:=fekCell; {B1} MyFormula[1].Col := 1; MyFormula[1].Row := 0; MyFormula[2].ElementKind:=fekAdd;; {+} MyWorksheet.WriteRPNFormula(0, 4, MyFormula);
// Erzeugt ein neues Arbeitsblatt MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2');
// Schreibt einige Zeichen in Zellen MyWorksheet.WriteUTF8Text(0, 0, 'Erster'); MyWorksheet.WriteUTF8Text(0, 1, 'Zweiter'); MyWorksheet.WriteUTF8Text(0, 2, 'Dritter'); MyWorksheet.WriteUTF8Text(0, 3, 'Vierter');
// Speichert das Kalkulationsblatt in eine Datei MyWorkbook.WriteToFile(MyDir + 'test' + STR_EXCEL_EXTENSION, OUTPUT_FORMAT); MyWorkbook.Free;
end. </delphi>
Opening an existing spreadsheet
To open a spreadsheet while specifying a particular format to use use ReadFromFile with two parameters:
<delphi> MyWorkbook.ReadFromFile(AFileName, sfExcel5); </delphi>
If ReadFromFile is called with only one parameter then it will use the extension to auto-detect the file format. In case of ambiguous formats like Excel 2-8 it will simply try various possibilities until one works. In the future it might make a more efficient check for the Excel format.
<delphi> MyWorkbook.ReadFromFile(AFileName); </delphi>
Writing a spreadsheet to file based on extension
Similar to the ReadFromFile routine, I've implemented a WriteToFile procedure (also with suggestions and enhancements from Felipe Monteiro de Carvalho) to determine the spreadsheet's type based on the filename suffix. It uses the getFormatFromFileName routine in the previous section's code, so the actual code is simple. However, it will always write files with a given extension using the latest format that uses that extension (e.g. Excel .xls files will be written as sfExcel8), so if you want to write them in an earlier format, you have to use the base routine.
As above, this code patches the fpspreadsheet.pas unit.
<delphi> procedure TsWorkbook.WriteToFile(const AFileName: string; const AOverwriteExisting: Boolean = False); overload; var SheetType: TsSpreadsheetFormat; begin
if getFormatFromFileName(AFileName, SheetType) then WriteToFile(AFileName, SheetType, AOverwriteExisting) else raise Exception.Create(Format( '[TsWorkbook.WriteToFile] Attempted to save a spreadsheet by extension, but the extension %s is invalid.', [ExtractFileExt(AFileName)]));
end; </delphi>
Iteration durch alle Arbeitsblätter
<delphi> var
MyWorkbook: TsWorkbook; MyWorksheet: TsWorksheet; i: Integer;
begin
// Hier wird MyWorkbook aus einer Datei geladen oder neu erzeugt for i := 0 to MyWorkbook.GetWorksheetCount() - 1 do begin MyWorksheet := MyWorkbook.GetWorksheetByIndex(i); // Mach etwas mit MyWorksheet end;
</delphi>
Daten aus einer Datenbank in eine Kalkulationstabelle konvertieren
Beachten Sie, dass es sich hier um nicht getesteten Meta-Code handelt.
<delphi> program db5xls;
{$mode delphi}{$H+}
uses
Classes, SysUtils, // alle notwendigen Datenbank-Units hinzufügen fpspreadsheet, fpsallformats, fpspreadsheet_pkg;
const OUTPUT_FORMAT = sfExcel5;
var
MyWorkbook: TsWorkbook; MyWorksheet: TsWorksheet; MyDatabase: TSdfDataset; MyDir: string; i, j: Integer;
begin
// Initialisierung MyDir := ExtractFilePath(ParamStr(0)); // die Datenbank öffnen MyDatabase := TSdfDataset.Create; MyDatabase.Filename := 'test.dat'; // hier die Tabellenbeschreibung hinzufügen MyDatabase.Active := True;
// Erzeugt die Kalkulationstabelle MyWorkbook := TsWorkbook.Create; MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet'); // die Feldnamen schreiben for i := 0 to MyDatabase.Fields.Count - 1 do MyWorksheet.WriteUTF8Text(0, i, MyDatabase.Field[i].FieldName);
// alle Felder in das Arbeitsblatt schreiben MyDatabase.First; j := 0; while not MyDatabase.EOF do begin for i := 0 to MyDatabase.Fields.Count - 1 do MyWorksheet.WriteUTF8Text(j + 1, i, MyDatabase.Field[i].AsString);
MyDatabase.Next; Inc(j); end;
// die Datenbank schließen MyDatabase.Active := False; MyDatabase.Free;
// Save the spreadsheet to a file MyWorkbook.WriteToFile(MyDir + 'test' + STR_EXCEL_EXTENSION, OUTPUT_FORMAT); MyWorkbook.Free;
end. </delphi>
Konvertierung zwischen zwei Tabellenkalkulationsformaten
Beachten Sie, dass es sich hier um nicht getesteten Meta-Code handelt.
<delphi> program ods2xls;
{$mode delphi}{$H+}
uses
Classes, SysUtils, fpspreadsheet, fpsallformats, fpspreadsheet_pkg;
const
INPUT_FORMAT = sfOpenDocument; OUTPUT_FORMAT = sfExcel8;
var
MyWorkbook: TsWorkbook; MyDir: string;
begin
// Initialisierung MyDir := ExtractFilePath(ParamStr(0)); // Konvertiert die Kalkulationstabelle MyWorkbook := TsWorkbook.Create; try MyWorkbook.ReadFromFile(MyDir + 'test.ods', INPUT_FORMAT); MyWorkbook.WriteToFile(MyDir + 'test.xls', OUTPUT_FORMAT); finally MyWorkbook.Free; end;
end. </delphi>
Verwendung von Formatierungsoptionen
Die Formatierung wird unabhängig vom Text gesetzt wie im folgenden Beispiel:
<delphi>
// Erzeugt einen fett geschriebenen Text MyWorksheet.WriteUTF8Text(0, 0, 'First'); MyWorksheet.WriteUsedFormatting(0, 0, [uffBold]);
</delphi>
Einstellen der Textorientierung
Es gibt drei mögliche Textrichtungen: trHorizontal, rt90DegreeClockwiseRotation and rt90DegreeCounterClockwiseRotation
Sie sind relativ zur Standardausrichtung des Textes.
<delphi>
// Schreibt in Fettschrift MyWorksheet.WriteUTF8Text(0, 0, 'First'); MyCell := MyWorksheet.GetCell(0, 0); MyCell^.TextRotation := rt90DegreeClockwiseRotation; MyCell^.UsedFormattingFields := [uffTextRotation];
</delphi>
Einstellen eines Randes
<delphi>
// Schreibt einen Text mit Rand und Hintergrundfarbe MyWorksheet.WriteUTF8Text(5, 9, '[N,W,E,S]');// J6 MyCell := MyWorksheet.GetCell(5, 9); MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth]; MyCell^.UsedFormattingFields := [uffBorder, uffBold, uffBackgroundColor];
</delphi>
Einstellen einer Hintergrundfarbe
Sie können eine von 16 Farben aus einer Palette für den Hintergrund auswählen. Die möglichen Werte sind:
<delphi>
{@@ Farben in FPSpreadsheet wie festgelegt in einer Excel-kompatiblen Palette }
TsColor = ( scBlack, // 000000H scWhite, // FFFFFFH scRed, // FF0000H scGREEN, // 00FF00H scBLUE, // 0000FFH scYELLOW, // FFFF00H scMAGENTA, // FF00FFH scCYAN, // 00FFFFH scDarkRed, // 800000H scDarkGreen,// 008000H scDarkBlue, // 000080H scOLIVE, // 808000H scPURPLE, // 800080H scTEAL, // 008080H scSilver, // C0C0C0H scGrey // 808080H // scGrey10pct,// E6E6E6H scGrey20pct // CCCCCCH );
</delphi>
Und ein Beispiel:
<delphi>
// Schreibt einen Text mit Hintergrundfarbe MyWorksheet.WriteUTF8Text(0, 0, 'Test'); MyCell := MyWorksheet.GetCell(0, 0); MyCell^.BackgroundColor := scSilver; MyCell^.UsedFormattingFields := [uffBackgroundColor];
</delphi>
Kombination mehrerer Formatierungen
<delphi>
// Schreibt einen Text mit Rand und mit Hintergrundfarbe MyWorksheet.WriteUTF8Text(5, 9, '[N,W,E,S]'); MyCell := MyWorksheet.GetCell(5, 9); MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth]; MyCell^.UsedFormattingFields := [uffBorder, uffBold, uffBackgroundColor];
</delphi>
Gitter- und Diagramm-Steuerelemente mit FPSpreadsheet
Siehe TsWorksheetChartSource
Download
Subversion
Sie können FPSpreadsheet mit dem folgenden Befehl herunterladen unter Verwendung von Subversion:
svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/fpspreadsheet fpspreadsheet
Neueste Version
Die neueste Version finden Sie hier auf SourceForge:
https://sourceforge.net/projects/lazarus-ccr/files/FPSpreadsheet/
Unterstützung und Fehlerberichte
Diskussionen zum Thema FPSpreadsheet sollten im Lazarus Forum: http://www.lazarus.freepascal.org/index.php/board,42.0.html geführt werden. Dort wird man auch am ehesten Unterstützung erhalten.
Fehlerberichte sollten an den Pascal Bug Tracker im Abschnitt "Lazarus-CCR" gesendet werden: http://bugs.freepascal.org/
Aktueller Fortschritt
Fortschritte nach unterstützten Formaten:
Format | Unterstützt mehrere Blätter? | Unterstützt Unicode? | Reader Fortschritt | Writer Fortschritt | Text | Zahl | String Formel | RPN Formel |
---|---|---|---|---|---|---|---|---|
Excel 2.x | Nein | Nein** | Working | Working | Working | Working | Nicht implementiert | Working |
Excel 3.0 | Nein | Nein** | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert |
Excel 4.0 | Nein | Nein** | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert |
Excel 5.0 (Excel 5.0 und 95) | Ja | Nein** | Working* | Working | Working | Working | Nicht implementiert | Working |
Excel 8.0 (Excel 97, 2000, XP und 2003) | Ja | Ja | Working* | Working | Working | Working | Nicht implementiert | Working |
Microsoft OOXML | Ja | Ja | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert | Nicht implementiert |
OpenDocument | Ja | Ja | Working | Working | Working | Working | Nicht implementiert | Nicht implementiert |
(*) Einige Zellen könnten leer bleiben aufgrund fehlender oder noch nicht implementierter Zahlen- und Textformate.
(**) In Formaten, die nicht Unicode unterstützen, werden die Daten als ISO 8859-1 (Latin 1)gespeichert. Sie können die Kodierung in TsWorkbook.Encoding ändern. Beachten Sie: FPSpreadsheet bietet Lese- und Schreibroutinen für UTF-8, aber die Daten könnten beim Lesen oder Schreiben auf Disk zu ISO konvertiert werden. Zeichen, die nicht zur ausgewählten Kodierung passen, gehen bei diesen Operationen verloren. Die Anmerkungen hier sind nur gültig für Formate, die Unicode nicht unterstützen.
Fortschritt der Formatierungsoptionen
Einige Formatierungsoptionen wurden hinzugefügt, aber sie sind noch nicht für alle Formate implementiert:
Format | Textrotation | Fett | Rand | Hintergrundfarbe |
---|---|---|---|---|
Excel 2.x | Not implemented | Not implemented | Not implemented | Not implemented |
Excel 3.0 | Not implemented | Not implemented | Not implemented | Not implemented |
Excel 4.0 | Not implemented | Not implemented | Not implemented | Not implemented |
Excel 5.0 (Excel 5.0 und 95) | - | - | Not implemented | Not implemented |
Excel 8.0 (Excel 97, 2000, XP und 2003) | Working | Working | Working | Working |
Microsoft OOXML | Not implemented | Not implemented | Not implemented | Not implemented |
OpenDocument | Working | Working | Working | Working |
Änderungen
Jan 2009
- Implemented a cross-platform support for OLE file. Now Excel 5.0 files can be created in any operating system.
- Adds read support for Excel 2.1
Feb 2008
- Initial commit to lazarus-ccr with write support for Excel 2.1, Excel 5.0 (Windows only) and experimental OOXML and OpenDocument
Lizenz
LGPL with static linking exception. Dies ist die selbe Lizenz wie sie von der Lazarus Component Library verwendet wird.
Siehe auch
Externe Links
- Microsoft OLE Document Format - http://sc.openoffice.org/compdocfileformat.pdf
- Excel-Dateiformat-Beschreibung - http://sc.openoffice.org/excelfileformat.pdf