std.office — Office-Dokumente

Das std.office-Paket ermöglicht das Erstellen von ODF-konformen Dokumenten (OpenDocument Format) direkt aus Lyx. Es unterstützt Textdokumente (ODT) und Tabellenkalkulationen (ODS). Die erzeugten Dateien lassen sich in LibreOffice, OpenOffice und Microsoft Office öffnen.

Unter der Haube verwendet std.office std.zip, um die ODF-Struktur als ZIP-Archiv zu schreiben.

Units-Übersicht · Lyx-Sprache


Units

Unit Code Beschreibung
std.office.odf_doc OFF-03 OdfDocument-Klasse: Kern-Dokument, XML-Aufbau, Style-Verwaltung, SaveToFile
std.office.odt OFF-04 ODT-Text-Writer: Absätze, Überschriften, formatierter Text
std.office.ods OFF-05 ODS-Tabellen-Writer: Sheets, Zellen (String, Int, Float)
std.office.odf_xml intern XML-Templates und Escape-Hilfsfunktionen (kein direkter Import nötig)

OdfDocument — Kern-Objekt

Alle Dokument-Typen bauen auf OdfDocument auf. Das Objekt verwaltet zwei interne Wachstums-Puffer: einen für den Dokumentinhalt, einen für automatische Stile (Fett, Kursiv).

Initialisierung und Speichern

import std.office.odf_doc;
import std.office.odt;

fn main(): int64 {
    var doc: OdfDocument;
    doc.Init(ODF_TYPE_TEXT);         // Textdokument

    OdtAddHeading(doc, "Bericht 2026", 1);
    OdtAddParagraph(doc, "Erstes Kapitel.");

    var rc: int64 := doc.SaveToFile("bericht.odt"c);
    doc.Close();
    return rc;
}

Konstante Wert Bedeutung
ODF_TYPE_TEXT 1 Textdokument (.odt)
ODF_TYPE_SPREADSHEET 2 Tabellenkalkulation (.ods)
ODF_OK 0 Speichern erfolgreich
ODF_ERR -1 Fehler beim Speichern

SaveToFile schließt offene ODS-Zeilen und -Sheets automatisch bevor es das ZIP schreibt.


ODT — Textdokumente

import std.office.odf_doc;
import std.office.odt;

fn CreateReport(path: pchar): void {
    var doc: OdfDocument;
    doc.Init(ODF_TYPE_TEXT);

    OdtAddHeading(doc, "Zusammenfassung", 1);
    OdtAddParagraph(doc, "Dieses Dokument wurde mit Lyx erzeugt.");

    OdtAddHeading(doc, "Details", 2);
    OdtAddParagraphStyled(doc, "Wichtiger Hinweis!", 1, 0);  // fett
    OdtAddParagraphStyled(doc, "Hinweis in kursiv.", 0, 1);  // kursiv
    OdtAddParagraphStyled(doc, "Fett und kursiv.", 1, 1);

    OdtAddHorizontalRule(doc);
    OdtAddParagraph(doc, "Ende des Berichts.");

    doc.SaveToFile(path as pchar);
    doc.Close();
}

Funktionen

Funktion Beschreibung
OdtAddParagraph(doc, text) Standardabsatz mit Standard-Style
OdtAddLineBreak(doc) Leerabsatz (Leerzeile)
OdtAddHorizontalRule(doc) Trennlinie (em-Dash-Zeichen)
OdtAddHeading(doc, text, level) Überschrift Ebene 1–6
OdtAddParagraphStyled(doc, text, bold, italic) Absatz mit Fett- und/oder Kursiv-Formatierung

Für OdtAddParagraphStyled gilt: bold und italic sind je 0 (aus) oder 1 (an). Werden beide auf 0 gesetzt, wird einfach OdtAddParagraph aufgerufen. Stile werden lazy angelegt und innerhalb des Dokuments wiederverwendet (Deduplizierung).


ODS — Tabellenkalkulationen

import std.office.odf_doc;
import std.office.ods;

fn CreateTable(path: pchar): void {
    var doc: OdfDocument;
    doc.Init(ODF_TYPE_SPREADSHEET);

    OdsAddSheet(doc, "Umsatz"c);

    // Kopfzeile (Zeile 0)
    OdsSetCell(doc, 0, 0, "Monat"c);
    OdsSetCell(doc, 0, 1, "Umsatz"c);
    OdsSetCell(doc, 0, 2, "Wachstum"c);

    // Datenzeilen
    OdsSetCell(doc,    1, 0, "Januar"c);
    OdsSetCellInt(doc, 1, 1, 12500);
    OdsSetCellFloat(doc, 1, 2, 523, 1);   // 52.3

    OdsSetCell(doc,    2, 0, "Februar"c);
    OdsSetCellInt(doc, 2, 1, 14200);
    OdsSetCellFloat(doc, 2, 2, 136, 1);   // 13.6

    // Zweites Sheet
    OdsAddSheet(doc, "Kosten"c);
    OdsSetCell(doc, 0, 0, "Posten"c);
    OdsSetCell(doc, 0, 1, "Betrag"c);

    doc.SaveToFile(path as pchar);
    doc.Close();
}

Funktionen

Funktion Beschreibung
OdsAddSheet(doc, name) Neues Sheet öffnen (schließt vorheriges Sheet automatisch)
OdsFlushSheet(doc) Aktuelles Sheet explizit schließen
OdsSetCell(doc, row, col, text) String-Zelle bei (row, col) schreiben
OdsSetCellInt(doc, row, col, val) Ganzzahl-Zelle schreiben
OdsSetCellFloat(doc, row, col, val, decimals) Gleitkomma-Zelle

Koordinaten

Zeilen (row) und Spalten (col) sind nullbasiert und müssen monoton steigend übergeben werden. Übersprungene Zeilen/Spalten werden automatisch mit leeren Zellen aufgefüllt.

Gleitkommazahlen

Da Lyx intern nur int64 kennt, werden Dezimalzahlen als ganzzahliger Wert mit einem Dezimalstellen-Faktor übergeben:

// 3.14 → val=314, decimals=2
OdsSetCellFloat(doc, 0, 0, 314, 2);

// -0.05 → val=-5, decimals=2
OdsSetCellFloat(doc, 0, 1, 0 - 5, 2);

// 1000 (keine Nachkommastellen) → decimals=0
OdsSetCellFloat(doc, 0, 2, 1000, 0);


Quelldateien

Datei Inhalt
std/office/odf_doc.lyx OFF-03: OdfDocument-Klasse, Puffer-Verwaltung, Style-Deduplizierung, ZIP-Ausgabe
std/office/odt.lyx OFF-04: ODT-Writer-Funktionen (Absatz, Überschrift, Formatierung)
std/office/ods.lyx OFF-05: ODS-Writer-Funktionen (Sheets, Zeilen, Zellen)
std/office/odf_xml.lyx XML-Templates (Header, Footer, Manifest, Styles) — intern, kein direkter Import

Letzte Aktualisierung: 2026-06-15