Sign in Join
Wiki copytemporary

Revision 1 of 2, by WikiArchive on 11-4-2026. The page as it is now.

FPSpreadsheet/de

DIESE SEITE IST VERALTET. BITTE VERWENDEN SIE DIE ENGLISCHE SEITE.

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.

Contents

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

pascal
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;

Verwendung von Zellbereichen und des unären Operators SUM

pascal
// =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

Verwendung eingebauter Routinen

pascal
// 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);

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

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

Öffnen eines bestehenden Kalkulationsblattes

Um ein Kalkulationsblatt unter Angabe eines besonderen Formats zu öffnen, verwenden Sie ReadFromFile mit zwei Parametern:

pascal
MyWorkbook.ReadFromFile(AFileName, sfExcel5);

Wird ReadFromFile mit nur einem Parameter aufgerufen, dann wird versucht, das Dateiformat anhand der Erweiterung zu erkennen. Im Falle mehrdeutiger Formate (wie bei Excel 2-8) werden einfach verschiedene Möglichkeiten probiert, bis eine funktioniert. In Zukunft könnte hier eine effizientere Überprüfung des Excel-Formats erfolgen.

pascal
MyWorkbook.ReadFromFile(AFileName);

Schreiben eines Kalkulationsblattes in eine Datei abhängig von der Erweiterung

Ähnlich der ReadFromFile-Routine, habe ich eine Prozedur WriteToFile implementiert (auch mit Vorschlägen und Verbesserungen von Felipe Monteiro de Carvalho), um den Typ eines Kalkulationsblattes anhand der Dateinamen-Erweiterung zu bestimmen. Sie nimmt die Routine getFormatFromFileName aus dem Code des vorigen Abschnitts, der Code ist also einfach. Trotzdem, beim Schreiben einer Datei mit vorgegebener Erweiterung, wird das jeweils neueste Format, das dieser Erweiterung zugeordnet ist, genommen (z.B. werden Excel .xls Dateien als sfExcel8 geschrieben). Falls Sie also ein früheres Format schreiben wollen, dann verwenden Sie bitte die Basisroutine.

Wie oben, modifiziert dieser Code die Unit fpspreadsheet.pas.

pascal
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;

Iteration durch alle Arbeitsblätter

pascal
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;

Daten aus einer Datenbank in eine Kalkulationstabelle konvertieren

Beachten Sie, dass es sich hier um nicht getesteten Meta-Code handelt.

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

Konvertierung zwischen zwei Tabellenkalkulationsformaten

Beachten Sie, dass es sich hier um nicht getesteten Meta-Code handelt.

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

Verwendung von Formatierungsoptionen

Die Formatierung wird unabhängig vom Text gesetzt wie im folgenden Beispiel:

pascal
// Erzeugt einen fett geschriebenen Text
      MyWorksheet.WriteUTF8Text(0, 0, 'First');
      MyWorksheet.WriteUsedFormatting(0, 0, [uffBold]);

Einstellen der Textorientierung

Es gibt drei mögliche Textrichtungen: trHorizontal, rt90DegreeClockwiseRotation and rt90DegreeCounterClockwiseRotation

Sie sind relativ zur Standardausrichtung des Textes.

pascal
// Schreibt in Fettschrift
      MyWorksheet.WriteUTF8Text(0, 0, 'First');
      MyCell := MyWorksheet.GetCell(0, 0);
      MyCell^.TextRotation := rt90DegreeClockwiseRotation;
      MyCell^.UsedFormattingFields := [uffTextRotation];

Einstellen eines Randes

pascal
// 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];

Einstellen einer Hintergrundfarbe

Sie können eine von 16 Farben aus einer Palette für den Hintergrund auswählen. Die möglichen Werte sind:

pascal
{@@ 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
      );

Und ein Beispiel:

pascal
// Schreibt einen Text mit Hintergrundfarbe
      MyWorksheet.WriteUTF8Text(0, 0, 'Test');
      MyCell := MyWorksheet.GetCell(0, 0);
      MyCell^.BackgroundColor := scSilver;
      MyCell^.UsedFormattingFields := [uffBackgroundColor];

Kombination mehrerer Formatierungen

pascal
// 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];

Gitter- und Diagramm-Steuerelemente mit FPSpreadsheet

Siehe TsWorksheetChartSource

Download

Subversion

Sie können FPSpreadsheet mit dem folgenden Befehl herunterladen unter Verwendung von Subversion:

pascal
svn checkout svn://svn.code.sf.net/p/lazarus-ccr/svn/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 Datum/Zeit
CSV Nein Ja nicht implementiert nicht implementiert nicht implementiert nicht implementiert nicht implementiert nicht implementiert nicht implementiert
Excel 2.x Nein Nein** Working Working Working Working nicht implementiert Working nicht implementiert
Excel 3.0 Nein Nein** nicht implementiert 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 nicht implementiert
Excel 5.0 (Excel 5.0 and 95) Ja Nein** Working* Working Working Working nicht implementiert Working nicht implementiert
Excel 8.0 (Excel 97, 2000, XP and 2003) Ja Ja Working* Working Working Working nicht implementiert Working Read only and dates only
Microsoft OOXML Ja Ja nicht implementiert Working nicht implementiert nicht implementiert nicht implementiert nicht implementiert nicht implementiert
OpenDocument Ja Ja Working Working Working Working nicht implementiert 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 Rahmen Hintergrundfarbe
CSV nicht verfügbar nicht verfügbar nicht verfügbar nicht verfügbar
Excel 2.x nicht implementiert nicht implementiert nicht implementiert nicht implementiert
Excel 3.0 nicht implementiert nicht implementiert nicht implementiert nicht implementiert
Excel 4.0 nicht implementiert nicht implementiert nicht implementiert nicht implementiert
Excel 5.0 (Excel 5.0 and 95) - - nicht implementiert nicht implementiert
Excel 8.0 (Excel 97, 2000, XP and 2003) Working Working Working Working
Microsoft OOXML nicht implementiert Working nicht implementiert nicht implementiert
OpenDocument Working Working Working Working

Änderungen

November 2011

Januar 2009

Februar 2008

Lizenz

LGPL with static linking exception. Dies ist die selbe Lizenz wie sie von der Lazarus Component Library verwendet wird.

Siehe auch

Externe Links


From the Free Pascal wiki, page "FPSpreadsheet/de", as the Internet Archive kept it on 2025-04-21. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.