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