Das XLSX-Format: ein ZIP-Container hats in sich

Bei dem XLSX-Format handelt es sich um ein Container-Format, das mehrere Dateien zusammenfasst. Hierzu wird eine ZIP-Komprimierung verwendet. Eine XLSX-Datei ist eigentlich ein ZIP-Archiv (nur mit der Endung .xlsx), das in einer Verzeichnisstruktur die einzelnen Dateien enthält. Dies bedeutet: wird eine XLSX-Datei mit einem ZIP-fähigen Programm dekomprimiert, erhält man eine festgelegte Ordnerstruktur in der alle notwendigen Informationen zur Beschreibung des Excel-Dokumentes als eine Sammlung von (zumeist XML-)Dateien gespeichert sind. Die Struktur des ZIP-Containers ist als Open Packaging Conventions (OPC) ein Teil der OOXML-Standardisierung. Die folgenden Beschreibungen dieses Kapitels basieren auf diesem Teil des Standards.

Abb. 1: Der OPC-Container nach der Dekomprimierung

Abb. 1: Der OPC-Container nach der Dekomprimierung

 

Wird eine neue Excel-Datei Mappe1.xlsx unverändert abgespeichert, sieht die Verzeichnisstruktur des Containers gemäß der Abbildung 2 aus.

Abb. 2: Inhalte des OPC-Containers

Abb. 2: Inhalte des OPC-Containers

 

Jede Datei im ZIP-Container stellt einen Part dar. Parts haben einen eindeutigen Namen und werden einem vordefinierten Content Type zugeordnet, der die Inhaltsstruktur des Parts angibt. Die Parts lassen sich gliedern in Parts, die Dokumentinhalte enthalten, Parts, die die Beziehungen innerhalb des Containers abbilden, und Parts, die Meta- und Layout-Informationen speichern.

 

Part-Name

Der vollständige Name des Parts besteht aus dem Pfad der Datei innerhalb des Containers. Der Part-Name der Datei sheet1.xml aus der Mappe1.xlsx wäre folglich /xl/worksheets/sheet1.xml. Der Name dient auch zur Adressierung eines Parts. Ebenfalls kann eine relative Adressierung stattfinden: Soll innerhalb der Datei workbook.xml.rels auf sheet1.xml verwiesen werden, kann dies mit der Angabe ../worksheets/sheet1.xml geschehen. Die Notation .. gibt in der Pfadangabe wie bei XPath oder der DOS-Kommandozeile den Befehl dafür, den Kontext eine Verzeichnisebene höher zu setzen.

In den folgenden Beschreibungen der Parts werden die vollständigen Namen der Parts gegebenenfalls durch Kurznamen ersetzt. Dabei wird der Pfad im OPC-Container und die Dateiendung weggelassen. Der Kurzname des Parts /xl/workbook.xml lautet somit workbook-Part.

 

Content Type

Der Part /[Content_Types].xml verzeichnet für alle Parts den Content Type. Da Parts die unterschiedlichsten Inhaltsmodelle haben können, von verschiedenen XML-Sprachen über Beschreibungen von Beziehungen im Container, Beschreibungen des Layouts bis zu Binär-Daten, wird hier mit einem eindeutigen String jedem Part ein Content Type zugeordnet. Der String entspricht einem Media Type aus dem HTTP/1.1-Standard des W3C.

Folgendes Beispiel zeigt den Aufbau des Parts /[Content_Types].xml:

<ct:Types>
  <ct:Default Extension="xml" ContentType="application/xml"/>
  <ct:Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
  <ct:Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>
  [...]
</ct:Types>

Hier wird der Content Type eines anderen Parts entweder über die Dateiendung oder direkt über den Part-Namen bestimmt. Mit dem <ct:Default>-Element werden alle Parts mit der Dateiendung, die im Extension-Attribut angegeben ist, dem Content Type zugeordnet, der im ContentType-Attribut steht. Mit dem <ct:Override>-Element kann diese Angabe für einzelne Parts überschrieben werden. Hierzu wird der vollständige Name des Parts im PartName-Attribut angegeben.

 

Content-Parts

Jedes Dokument hat einen Mainpart. Dieser ist gewöhnlich im XLSX-ZIP-Container im Ordner xl die Datei workbook.xml. Der Name des Mainparts lautet also: /xl/workbook.xml. Diese Datei enthält eine Liste aller Registerblätter (also Tabellenblätter oder Chartsheets), die dieses Excel-Dokument enthält. In andere im Verzeichnis xl angelegte Parts werden u.a. folgende Inhalte ausgelagert:

Für jedes Tabellenblatt des Dokumentes wird im Verzeichnis /xl/worksheets ein sheet[i].xml angelegt. Das [i] steht hier wie auch bei den anderen Part-Sammlungen im OPC-Container für einen Index, der die Reihenfolge der Sammlungsobjekte innerhalb des Dokuments angibt. Der Part-Name des ersten Tabellenblattes im Dokument lautet also /xl/worksheets/sheet1.xml. Der Inhalt des Tabellenblattes wird in diesem Part mit SpreadsheetML dargestellt. Eine genauere Beschreibung der Sheet-Parts finden Sie unter SpreadsheetML.

Ist ein Diagramm eingebunden, wird ein Part /xl/charts/chart[i].xml erzeugt. Der Part enthält alle Informationen über das Diagramm dargestellt in DrawingML. Die DrawingML-Struktur wird unter DrawingML beschrieben.

Die Positions- und Größenangaben zur Darstellung des Diagramms auf dem Tabellenblatt werden allerdings in einem Part für den Rahmen, genannt Drawing-Part, ausgelagert. Neben Diagrammen greifen u. a. auch eingebundene Bilder und SmartArt-Grafiken auf einen solchen Drawing-Rahmen zurück. Drawing-Parts erhalten den Namen /xl/drawings/drawing[i].xml.

Ein Drawing-Part für eingebundene Grafiken verweist auf eine Kopie der originalen Grafik-Datei, die im Container unter /xl/media/ abgelegt wird. Der Name der Bilddatei wird standardisiert auf image[i] mit der entsprechenden Dateiendung der Originaldatei (z.B. .jpeg). Daher kann /xl/media/image[i].[Format] als allgemeiner Name verwendet werden.

Für SmartArts werden mehrere XML-Dateien unter dem Verzeichnis /xl/diagrams/ abgelegt. SmartArt-Grafiken werden durch color[i].xml, data[i].xml, drawing[i].xml, layout[i].xml und quickStyle[i].xml beschrieben.

 

Relationship-Parts

Wird in einem Part auf einen anderen Part des OPC-Containers verwiesen, erfolgt dies immer in indirekter Weise. Sämtliche Beziehungen eines Parts werden in einem zugehörigen Relationship-Part gesammelt. Anstatt, dass der Part (Basis-Part) mit einem Pfad direkt auf den anderen Part verweist, referenziert nun der Relationship-Part mit mehreren Relationships auf alle Parts, auf die der Basis-Part referenzieren soll. Der Basis-Part verweist nun nur noch auf die Relationships des zugehörigen Relationship-Parts.

Abb. 3: Indirekte Beziehung zwischen zwei Parts durch ein Relationship-Part

Abb. 3: Indirekte Beziehung zwischen zwei Parts durch ein Relationship-Part

 

Relationship-Parts sind immer genau einem Basis-Part zugeordnet. Einzige Ausnahme ist die Datei .rels im /_rels-Ordner (in der obersten Ebene des XLSX-Containers). Diese legt den Mainpart fest. Abgesehen von der Ausnahme der .rels-Datei folgen die Relationship-Parts einem einheitlichen Prinzip: Der Ordner, der den Basis-Part enthält, erhält einen Unterordner mit dem Namen _rels. Dieser enthält das entsprechende Dokument, das den Relationship-Part darstellt. Der Name der Datei ist identisch mit dem des Basis-Parts, abgesehen von einer zusätzlichen Endung .rels. Für den Basis-Part /xl/workbook.xml ist also der Relationship-Part unter /xl/_rels/workbook.xml.rels zu finden. Obwohl die Relationship-Parts die Dateiendung .rels haben, handelt es sich hierbei um wohlgeformte XML-Dokumente.

Sie beschreiben die zielführenden Beziehungen des Basis-Parts zu anderen Parts (Ziel-Parts). Das bedeutet, wird ein Ziel-Part in dem Basis-Part referenziert, wird die entsprechende Beziehung in dem Relationship-Part notiert. Im Relationship-Part des Ziel-Parts wird dies jedoch nicht vermerkt. Da einige Parts nur von anderen referenziert werden, nicht aber selbst auf Parts verweisen, haben diese keinen zugehörigen Relationship-Part.

Aufbau

Der Namensraum für die Elemente in Relationship-Parts hat den URI schemas.openxmlformats.org/package/2006/relationships. Der Part verfügt dabei nur über zwei verschiedene Elemente: Das Wurzelelement <rp:Relationships> und dessen <rp:Relationship>-Kindelemente. Jedes <rp:Relationship>-Element erstellt ein Relationship vom Basis-Part zu einem Ziel-Part. Folgendes Beispiel zeigt den Relationship-Part /xl/worksheets/_rels/sheet1.xml.rels:

<rp:Relationships>
     <rp:Relationship Id="rId1" Target="../drawings/drawing1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"/>
     [...]
</rp:Relationships>

Das Id-Attribut legt hier eine ID für das Relationship fest. Diese wird im Basis-Part verwendet, um eine Referenz zu diesem Relationship zu erzeugen. Es wird somit im Basis-Part nur noch indirekt auf den Ziel-Part verwiesen. Die Referenz im Basis-Part zeigt nicht direkt auf den Part, sondern nur auf den Relationship im Relationship-Part, der den Ziel-Part referenziert.

Das Target-Attribut gibt den Ziel-Part des Relationships an. Die relative Angabe erfolgt nicht vom Relationship-Part aus, sondern vom Basis-Part. Da der Basis-Part in diesem Beispiel /xl/worksheets/sheet1.xml ist, ist der Ziel-Part also der Part /xl/drawings/drawing1.xml.

Im Type-Attribut wird ein URI angegeben, der den Typ des Relationships angibt. Der Relationship-Typ soll die Rolle des Ziel-Parts innerhalb des Basis-Parts beschreiben. Der Typ hängt vom Content Type des Ziel-Parts ab. Die Tabelle 1 stellt die gängigsten Relationship-Typen dar.

Ziel-Part

Relationship-Typ

drawing

schemas.openxmlformats.org/officeDocument/2006/relationships/drawing

chart

schemas.openxmlformats.org/officeDocument/2006/relationships/chart

image

schemas.openxmlformats.org/officeDocument/2006/relationships/image

sheet

schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet

styles

schemas.openxmlformats.org/officeDocument/2006/relationships/styles

Tabelle 1: Relationship-Types für verschiedene Ziel-Parts

 

Meta- und Layout-Informationen

Zusätzlich zu den Parts, die den Content beschreiben und den Relationship-Parts gibt es noch Parts, die Meta-Daten bzw. Layout-Information beschreiben. Der Part /[Content_Type].xml wurde vorstehend schon beschrieben. Neben diesem gibt es noch die Parts /docProps/app.xml und /docProps/core.xml, die Meta-Informationen des Dokumentes enthalten, wie etwa Informationen über die verwendete Excel-Version im app-Part bzw. Erstellungsdatum, Autor des Dokumentes etc. im Part core.

Des Weiteren sind Layout-Informationen für einzelne Zellen im Part /xl/styles.xml abgelegt, das verwendete Design in /xl/theme/theme[i].xml. Kalkulierte, also automatisch berechnete Zellen erhalten eine Referenz im Part /xl/calcChain.xml.

 

<< zurück vor >>
  zum Seitenanfang >>
Tipp der data2type-Redaktion:
Zum Thema SpreadsheetML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: