minimale ODS-Datei

Im Zusammenhang mit meinem ods-reader, einer Java-Bibliothek zum effizienten Lesen von OpenDocument-Tabellen, fragte jemand nach dem Schreiben von ODS-Dateien. Das habe ich mir mal angesehen. Es ist gar nicht so schwer, eine minimale Tabelle zu erstellen.

Inhalt einer ODS-Tabel

Eine ODS-Datei ist ein ZIP-Archiv mit bestimmten Dateien drin. Im Minimalfall sind es diese drei Dateien:

.
├── content.xml
├── META-INF
│   └── manifest.xml
└── mimetype

Der Clou ist, dass zwei Dateien einen festen Inhalt haben:

mimetype

Dies ist eine Textdatei mit dem Inhalt application/vnd.oasis.opendocument.spreadsheet. So wird erkannt, dass es sich um eine Tabelle handelt.

META-INF/manifest.xml

Auch dies ist ein XML-serialisiertes RDF-Dokument, das den Inhalt der ZIP-Datei beschreibt:

<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.3" >
 <manifest:file-entry manifest:full-path="/" manifest:version="1.3" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/>
 <manifest:file-entry manifest:full-path="content.xml" manifest:media-type="text/xml"/>
</manifest:manifest>

content.xml

Dies ist die wirklich interessante Datei. Es ist eine XML-Datei, in der der eigentliche Tabelleninhalt steht. Wenn einen XML nicht abschreckt, dann kann man das sogar ziemlich gut lesen.

Es gibt eine Tabelle (table) mit dem Namen Tabelle1. Es wird angekündigt, dass es drei Spalten geben wird. Dann folgt eine Zeile (table-row) mit drei Zellen (table-cell) mit dem Datentyp Text (string). Wichtig ist, dass der Zelleninhalt in einem Absatz text:p steht.

Auch die zweite Zeile hat drei Spalten. Dies sind aber Zahlen (float). Da man Zahlen unterschiedlich schreiben kann, wird für Zahlen noch der maschinenlesbare Wert als Attribut office:value angegeben.

<?xml version="1.0" encoding="utf-8"?>
<office:document-content office:version="1.3"
      xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
      xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
      xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
  <office:scripts />
  <office:body>
    <office:spreadsheet>
      <table:calculation-settings table:automatic-find-labels="false" 
                                  table:use-regular-expressions="false" table:use-wildcards="true" />
      <table:table table:name="Tabelle1">
        <table:table-column table:number-columns-repeated="3" table:default-cell-style-name="Default" />
        <table:table-row>
          <table:table-cell office:value-type="string">
            <text:p>a</text:p>
          </table:table-cell>
          <table:table-cell office:value-type="string">
            <text:p>b</text:p>
          </table:table-cell>
          <table:table-cell office:value-type="string">
            <text:p>c</text:p>
          </table:table-cell>
        </table:table-row>
        <table:table-row>
          <table:table-cell office:value-type="float" office:value="1">
            <text:p>1</text:p>
          </table:table-cell>
          <table:table-cell office:value-type="float" office:value="2">
            <text:p>2</text:p>
          </table:table-cell>
          <table:table-cell office:value-type="float" office:value="3">
            <text:p>3</text:p>
          </table:table-cell>
        </table:table-row>
      </table:table>
      <table:named-expressions />
    </office:spreadsheet>
  </office:body>
</office:document-content>

ODS-Datei erstellen

Diese drei Dateien muss man dann nur noch in ein ZIP-Archiv packen und fertig ist die ODS-Datei.

zip minimal.ods content.xml mimetype META-INF/manifest.xml

Wie man sieht, kann man mit drei fixen Dateien und ein wenig XML-Ausgabe bereits eine OpenDocument-Tabelle erzeugen. Die Tabelle kann man dann nach Belieben komplizierter gestalten, um auch optisch ansprechende Tabellen-Exporte zu erzeugen. Dafür braucht man dann schnell noch eine weitere Datei styles.xml, in der die Stile für die Zellen festgelegt sind. Diese muss dann auch in der META-INF/manifest.xml eingetragen werden.

Man kann sich auch gut existierende OpenDocument-Dateien entpacken und sich deren Inhalt ansehen. Am besten erstellt man pro Dokument ein eigenes Verzeichnis, um alle Dateien an einem Platz zu haben, z.B.

mkdir tabelle
cd tabelle
unzip ../tabelle.ods
# Dateien bearbeiten
zip -r ../neu.ods .

Kommentare

Mit einem Konto im Fediverse oder auf Mastodon kannst du auf diesen Beitrag antworten. Da Mastodon dezentral funktioniert, kannst du dein bestehendes Konto auf einem Mastodon-Server oder einer kompatiblen Plattform verwenden.

Nach einem Klick auf "Lade Kommentare" werden nicht-private Antworten vom Server norden.social geladen und unten angezeigt.

Wie das technisch funktioniert, kann man hier erfahren.