Technical Article

Export Excel Worksheets to PDF in Delphi Without Office

Um ein Excel-Arbeitsblatt (Worksheet) ohne installiertes Office aus Delphi oder C++Builder nach PDF zu exportieren, rufen Sie die Methode SaveAsPDF auf einem HotXLS-Arbeitsblatt oder einer Arbeitsmappe auf. HotXLS ist eine native VCL-Excel-Komponente. Ihr PDF-Export rendert den belegten Bereich (Used Range) des Arbeitsblatts in eine eigenständige PDF-1.4-Datei und bildet Excel-Spaltenbreiten und Zelltexte auf A4-Seiten mit automatischer Seitenaufteilung ab. Dabei sind weder eine installierte Excel-Instanz noch Druckertreiber oder externe DLLs beteiligt

HotXLS behandelt PDF als Datenpräsentationsformat — als Geschwisterteil seiner CSV-, TSV- und HTML-Exportpfade und nicht als pixelgenaue Rendering-Engine. Der Export reproduziert tabellarische Inhalte und Layouts: die Werte, die Sie im Gitter sehen, die Spaltenproportionen und die Gitterlinien um die Zellen. Dieses Verständnis ist wichtig, da es von vornherein eine realistische Erwartungshaltung schafft. Der Rest dieses Artikels beschreibt genau, wo diese Grenze verläuft

Wie konvertiert man Excel in Delphi ohne Office nach PDF?

Der kürzeste Weg ist ein einziger Aufruf. TXLSWorksheet stellt die Methoden SaveAsPDF(FileName) und SaveAsPDF(Stream) bereit, und TXLSWorkbook bietet dieselben zwei Überladungen an, die an das aktive Blatt weitergeleitet werden. Jede Methode gibt einen Integer-Wert zurück (1 bei Erfolg, -1 bei Fehlern), sodass Sie das Ergebnis direkt abfragen können, ohne den Aufruf in eine eigene Exception-Behandlung einschließen zu müssen

uses
  lxHandle;

var
  Book: TXLSWorkbook;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('sales-june.xlsx');
    // Render the active sheet's used range straight to report.pdf.
    if Book.SaveAsPDF('report.pdf') = 1 then
      Writeln('PDF written');
  finally
    Book.Free;
  end;
end;

Wenn Sie SaveAsPDF auf einem Arbeitsblatt aufrufen, exportiert HotXLS den UsedRange dieses Blattes, also den umgrenzenden Bereich aller belegten Zellen. Die Überladung auf Arbeitsmappenebene ist eine praktische Funktion, die an das aktive Blatt delegiert. Ein mehrseitiger Bericht durchläuft also entweder die benötigten Blätter in einer Schleife oder wählt vor dem Aufruf das aktive Blatt aus. Es gibt keinen Gesamt-Arbeitsmappen-Modus, der alle Registerkarten in einem einzigen Durchlauf aneinanderhängt: Jeder Aufruf rendert genau ein Blatt oder einen Bereich

Wie verwandelt HotXLS einen belegten Bereich in PDF-Seiten?

HotXLS durchläuft den belegten Bereich Zelle für Zelle und ordnet ihn als paginiertes Gitter an. Die Spaltengeometrie stammt direkt aus Excel: Jede Spaltenbreite wird aus der Excel-Breiteneinheit in typografische Punkte umgerechnet, wobei ein Mindestwert gilt, damit keine Spalte zu einem Streifen zusammenschrumpft. Wenn die Spalten zusammen breiter als die nutzbare Seite sind, skaliert HotXLS sie gleichmäßig herunter, damit sie auf die Seite passen. Wenn sie bereits passen, belässt er sie bei ihrer natürlichen Breite, statt sie über das Blatt zu dehnen

Die Zeilen fließen dann die Seite hinunter, bis die nächste Zeile den unteren Rand überschreiten würde. An diesem Punkt öffnet HotXLS eine neue Seite und fährt fort, sodass ein Blatt mit tausend Zeilen ganz ohne Ihr Zutun automatisch paginiert wird. Jede Zelle gibt ihren formatierten Text (FormattedText) aus, also die Zeichenfolge, die nach Anwendung des Zahlenformats entsteht. So wird ein Datum so angezeigt, wie es das Blatt zeigt, und eine Währungszelle behält ihre Tausendertrennzeichen und ihr Symbol. Text, der seine Spalte überschreitet, wird auf die Zellenbreite abgeschnitten, anstatt in die Nachbarzelle überzufließen

Steuerung von Ausrichtung, Rändern und Schriftgröße

Für alles, was über das Standardlayout hinausgeht, steuern Sie den Exporter direkt an. TXLSPDFExport ist die Klasse hinter den einzeiligen Hilfsfunktionen und veröffentlicht drei Eigenschaften: Orientation (xlsPdfPortrait oder xlsPdfLandscape, standardmäßig Hochformat), Margin (in Punkten, Standardwert 40) und FontSize (in Punkten, Standardwert 9). Setzen Sie diese vor dem Aufruf von SaveAsPDF, und das gesamte Dokument übernimmt diese Einstellungen

uses
  lxHandle, lxPDF;

var
  Book: TXLSWorkbook;
  Exporter: TXLSPDFExport;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('wide-ledger.xlsx');
    Exporter := TXLSPDFExport.Create;
    try
      Exporter.Orientation := xlsPdfLandscape;  // fit wide sheets on the page
      Exporter.Margin := 28;                     // tighter page margin, in points
      Exporter.FontSize := 8;                    // denser rows
      Exporter.SaveAsPDF(Book.ActiveSheet, 'ledger.pdf');
    finally
      Exporter.Free;
    end;
  finally
    Book.Free;
  end;
end;

TXLSPDFExport akzeptiert auch einen Bereich anstelle eines ganzen Blattes über SaveAsPDF(Range: IXLSRange; ...). So exportieren Sie einen Zusammenfassungsblock aus einem Blatt, das ansonsten Hilfsberechnungen enthält. Diese Bereichsüberladung wird auch von der Hilfsfunktion des Arbeitsblatts intern genutzt, sodass sich Layout, Skalierung und Seitenaufteilung identisch verhalten, egal ob Sie den gesamten belegten Bereich oder eine handverlesene Auswahl übergeben

var
  Book: TXLSWorkbook;
  Exporter: TXLSPDFExport;
  Summary: IXLSRange;
begin
  Book := TXLSWorkbook.Create;
  try
    Book.Open('quarter.xlsx');
    // Export only the summary block, not the scratch columns beside it.
    Summary := Book.Sheets[1].Range['A1', 'F20'];
    Exporter := TXLSPDFExport.Create;
    try
      Exporter.SaveAsPDF(Summary, 'summary.pdf');
    finally
      Exporter.Free;
    end;
  finally
    Book.Free;
  end;
end;

Warum HotXLS keine Schriftarten einbettet: Helvetica und WinAnsi

HotXLS schreibt Text mit der PDF-eigenen Helvetica und der WinAnsiEncoding — eine bewusste Entscheidung für minimale Abhängigkeiten mit einer konkreten Einschränkung. Da Helvetica zu den standardmäßigen 14 Schriftarten gehört, die jeder konforme PDF-Reader bereits mitbringt, bettet der Exporter überhaupt kein Schriftprogramm ein: Die Datei bleibt klein und öffnet sich überall, ohne dass Lizenzen erworben oder Dateien mitgeliefert werden müssen. Die Kehrseite dieser Entscheidung ist der Zeichensatz, den die Seite darstellen kann

Das WinAnsiEncoding deckt den Windows-1252-Zeichensatz ab, sodass lateinischer Text, gängige Satzzeichen und die üblichen westeuropäischen Umlaute korrekt dargestellt werden. HotXLS übersetzt eine Handvoll typografischer Zeichen, geschwungene Anführungszeichen, Gedankenstriche und das Euro-Symbol in ihre CP1252-Gegenstücke. Zeichen außerhalb dieses Bereichs, wie CJK-Schriftzeichen (Chinesisch/Japanisch/Koreanisch), Kyrillisch, Griechisch und Arabisch, werden auf der Seite als Fragezeichen ausgegeben. Wenn Ihre Blätter nicht-lateinischen Text enthalten, ist dieser Exporter das falsche Werkzeug, und Sie benötigen einen PDF-Renderer mit vollständiger Schriftartunterstützung

Wo der PDF-Export von Arbeitsblättern an seine Grenzen stößt

HotXLS rendert Inhalte und Strukturen, nicht das vollständige visuelle Design des Arbeitsblatts. Zellfüllungen, Rahmenstile pro Kante, Schriftarten und Farben pro Zelle, Diagramme und eingebettete Bilder liegen außerhalb dessen, was der Exporter zeichnet. Was Sie erhalten, ist das Textgitter mit einheitlichen Gitterlinien. Dies ist derselbe Vertrag, den auch die HTML- und RTF-Exporter erfüllen, und er ist passend für Berichte oder Datenübergaben, bei denen die Zahlen die Bedeutung tragen und nicht das Design

Wenn das Ziel ein gestaltetes, markenkonformes Dokument ist, besteht das übliche Verfahren darin, die Zahlen zunächst in einer Tabellenvorlage zusammenzustellen, was im vorlagenbasierten Berichtserstellungs-Workflow ausführlich behandelt wird. Und da nichts davon COM oder eine laufende Excel-Instanz berührt, passt die Pipeline in dasselbe Office-freie Automatisierungsmodell, das HotXLS überall nutzt: reiner Pascal-Code, einsetzbar auf einem headless Server, ohne Lizenzen oder Wartungsaufwand

Die eigenständige PDF-Datei, Byte für Byte

HotXLS baut die PDF-Dateistruktur manuell auf und berechnet seine Querverweistabelle (Cross-Reference Table) aus exakten Byte-Offsets, weshalb die Ausgabe in jedem Reader geöffnet werden kann. Beim Serialisieren jedes Objekts zeichnet HotXLS das Start-Offset dieses Objekts auf, bevor es dessen Bytes anhängt, und erhöht dann die laufende Position um die soeben geschriebene Länge. So landet die xref-Tabelle präzise auf jedem Objekt und startxref markiert den Beginn dieser Tabelle. Ein Reader, bei dem diese Offsets auch nur um ein Byte abweichen, weist die gesamte Datei ab. Das macht die selbstberechneten Offsets zum tragenden Element des Exporters

Dieser logische Aufbau bringt eine strikte Konsequenz mit sich, die man kennen sollte: Der Pages-Knoten wird zuerst als Objekt 1 geschrieben. Seine Liste der Kindseiten ist jedoch erst bekannt, wenn jede Seite ausgegeben wurde. Daher reserviert HotXLS ihn als Platzhalter und fügt die endgültigen Kindseiten und deren Anzahl vor dem Offset-Durchlauf ein, niemals danach. Sobald die Bytes eines Objekts für die xref gemessen wurden, sind sie eingefroren: Das nachträgliche Ändern auch nur eines Bytes würde jedes folgende Offset verschieben und die Tabelle beschädigen. Es ist eine kleine Disziplin, die eine standardkonforme PDF-1.4-Datei ohne eine darunter liegende Bibliothek garantiert

Die gezeigten SaveAsPDF-Methoden und die Klasse TXLSPDFExport werden mit der Excel-Komponente HotXLS für Delphi geliefert, zusammen mit den CSV-, HTML- und RTF-Exportern und der vollständigen Arbeitsblatt-API für Delphi und C++Builder