DrawingML

Im Artikel SpreadsheetML wurde ausführlich das Tabellenmodell des OOXML-Standards erläutert. Dieses setzt jedoch hauptsächlich Funktionen um, die bereits in der Vorgängerversion von SpreadsheetML für Office 2003 möglich waren.

Die Sprache DrawingML ist nun innerhalb des OOXML-Standards dafür zuständig, Objekte abzubilden, die auf einem Tabellenblatt platziert werden, und diese in das Excel-Dokument einzubinden. Zu den Objekten gehören u.a. Grafiken, ClipArts, Formen, SmartArts, Diagramme und Textfelder. Dieser Artikel beschränkt sich jedoch auf die Beschreibung der Einbindung von Grafiken und Diagrammen.

DrawingML wird sowohl für die Einbindung der Objekte als auch für die Darstellung eben dieser verwendet. Dabei wird die Sprache in verschiedenen Parts mit unterschiedlichen Namensräumen verwendet (siehe Tabelle "Namensräume in DrawingML").

Präfix

Namensraum-URI

Aufgabe

xdr

schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing

Einbindung der Objekte

a

schemas.openxmlformats.org/drawingml/2006/main

Darstellung von Textobjekten

c

schemas.openxmlformats.org/drawingml/2006/chart

Darstellung von Diagrammen

Tabelle: Namensräume in DrawingML

 

Im ersten Teil des OOXML-Standards ist ebenfalls die Beschreibung von DrawingML zu finden. Auch hier wird, durch Gliederung in unterschiedliche Kapitel, zwischen der Einbindung und der Darstellung der Objekte unterschieden. Die anschließende Beschreibung erfolgt auf Basis dieser Kapitel sowie anhand der Funktionsweise von Excel.

Die folgenden Parts werden benötigt, um Diagramme und Grafiken in Excel-Dokumente einzubinden:

  • /xl/drawings/drawing[i].xml

  • /xl/charts/chart[i].xml

  • /xl/media/image[i].[ Format ]

Erstere Parts beschreiben sowohl für Diagramme als auch für eingefügte Grafiken den Rahmen, in dem das entsprechende Objekt auf dem Tabellenblatt platziert wird. Sie stellen somit die Verbindung zwischen Tabellenblättern und den zu platzierenden Objekten her. Dabei werden sowohl Position und Größe als auch die Seitenproportionen des Objektes bestimmt. Jedes Tabellenblatt kann maximal einen Drawing-Part haben. Werden mehrere Objekte auf einem Tabellenblatt platziert, ist dieser Part für jedes dieser Objekte zuständig.

Die chart-Parts sind für die Diagramme zuständig. In diesen Parts können unterschiedliche Diagrammarten beschrieben werden (z.B. Säulen-, Linien-, Kreis-, Flächen- oder Punktdiagramme). Der Part enthält nun auch die dargestellten Daten und die Verweise auf die entsprechenden Tabellenzellen, die diese Daten enthalten.

Eine Besonderheit stellen die image-Parts dar, die auf dem Tabellenblatt platzierte Grafiken beschreiben. Es handelt sich dabei nicht um XML-Dateien, sondern um Bilddateien, die in einem Binärformat in den Container kopiert werden. Dabei unterscheidet sich die Kopie lediglich im Namen vom Original. Die entsprechende Dateiendung der Bilddatei wird im oben aufgeführten Part-Namen durch den Platzhalter [Format] ersetzt. Die Nummerierung des Parts ([i]) ist davon jedoch unabhängig. Sind beispielsweise die Bildgrafiken logo_gross.jpg, logo_mittel.png und logo_klein.jpg in ein Excel-Dokument eingebunden, wird erstere Grafik als Part /xl/media/image1.jpg in den XLSX-Container kopiert, die zweite als Part /xl/media/image2.png und die letzte wiederum als Part /xl/media/image3.jpg.

 

Einbindung in SpreadsheetML

Soll ein Tabellenblatt über ein Drawing-Part verfügen, muss am Ende des sheet-Parts ein <drawing>-Element eingefügt werden.

<worksheet>
     [...]
  <drawing r:id="rId1"/>
</worksheet>

Über das r:id-Attribut wird auf das entsprechende Relationship im zugehörigen Relationship-Part verwiesen. Das Relationship gibt nun den entsprechenden Drawing-Part an.

 

Drawing-Part

Es gibt im Drawing-Part drei verschiedene Arten, ein Objekt zu platzieren. Entsprechend kann das Wurzelelement <xdr:wsDr> drei verschiedene Top-Level-Elemente enthalten. Das <xdr:twoCellAnchor>-Element beschreibt den Rahmen, in dem das Objekt platziert wird, anhand zweier Ankerpunkte, die über die Kindelemente <xdr:from> und <xdr:to> angegeben werden. Ersteres beschreibt den oberen linken Eckpunkt des Rahmens, Letzteres den unteren rechten. Im Gegensatz dazu beschreibt das <xdr:oneCellAnchor>-Element neben dem linken oberen Eckpunkt (ebenfalls durch das <xdr:from>-Element) die Breite und Höhe des Rahmens (<xdr:ext>). Die dritte Möglichkeit zur Platzierung ist das <xdr:absoluteAnchor>-Element. Soll ein Diagramm auf einem eigenen Sheet (ohne Tabellenfunktion) platziert werden, wird dieser absolute Anker verwendet. Dabei wird die Position des linken oberen Eckpunktes mit dem <xdr:pos>-Element angegeben und die Breite und Höhe des Rahmens mit dem <xdr:ext>-Element. Der Unterschied zum <xdr:oneCellAnchor>-Anker ist, dass das <xdr:from>-Element die Position des Eckpunktes anhand einer Zelle beschreibt (durch Spalten- und Zeilenangabe) und das <xdr:pos>-Element einen absoluten Abstand vom oberen bzw. linken Rand angibt.

Positionierung

Wie bereits erläutert, legen die Elemente <xdr:from>, <xdr:to>, <xdr:ext> und <xdr:pos> die Position und Maße des Rahmens fest. Die ersten zwei bestimmen jeweils eine Position anhand einer Tabellenzelle, während die anderen beiden absolute Positionen bzw. Breiten und Höhen angeben.

Entsprechend haben die Elemente <xdr:from> und <xdr:to> auch das gleiche Inhaltsmodell. Sie enthalten jeweils die Elemente <xdr:col>, <xdr:colOff>, <xdr:row> und <xdr:rowOff>. Die Elemente <xdr:col> und <xdr:row> bestimmen durch einen positiven Integer als Inhalt die Spalte bzw. Zeile. Der Integer gibt dabei den Index der Spalte bzw. Zeile an, wobei die Spalte A und die erste Zeile den Index 0 haben.

Innerhalb dieser Zelle wird der Ankerpunkt platziert. Mit den Elementen <xdr:colOff> und <xdr:rowOff> kann nun der Abstand des Punktes zum linken bzw. oberen Zellenrand angegeben werden. Übersteigt der angegebene Abstand die Breite bzw. Höhe der Zelle, wird der Ankerpunkt an den rechten oder unteren Zellenrand platziert.

<xdr:from>
  <xdr:col>11</xdr:col>
  <xdr:colOff>752475</xdr:colOff>
  <xdr:row>0</xdr:row>
  <xdr:rowOff>66675</xdr:rowOff>
</xdr:from>

Der linke obere Eckpunkt des Objektes liegt in diesem Beispiel innerhalb der Zelle L1, da die Spalte L die zwölfte Spalte ist. Die Abstandsangaben der Elemente <xdr:colOff> und <xdr:rowOff> werden wie alle Längenangaben in DrawingML in English Metric Units (EMU) angegeben. EMU ist eine von Microsoft kreierte Einheit, die im Standard als high precision coordinate space (dt.: hoch präzise Maßeinheit, ECMA-376 1st edition Part 4, Seite 3694) bezeichnet wird. Ein EMU ist dabei 1/360000 cm oder 1/914400 Inch (Web-Artikel von Rick Jelliffe).

Die Elemente <xdr:pos> und <xdr:ext> erhalten die Positions- bzw. Breiten- und Höhenangaben durch jeweils zwei Attribute. Bei dem <xdr:ext>-Element sind das die Attribute cx und cy. Hier wird die Breite (cx) und die Höhe (cy) des Rahmens ebenfalls in EMUs angegeben. Für die Breite und Höhe gibt es keine Möglichkeit einer automatischen Angabe. Dies führt zu Problemen bei der Platzierung von Bild-Dateien, da zwei fixe Werte zu einer Verzerrung der Grafik führen können.

Die absolute Position des Rahmens wird im <xdr:pos>-Element entsprechend durch die Attribute x und y angegeben.

Objekte

Die vorstehenden Beschreibungen gelten unabhängig davon, ob ein Bild, ein Diagramm oder ein anderes Objekt platziert werden soll. Den Positionsangaben folgt das Element, das bestimmt, welches der möglichen Objekte platziert wird. Hierfür stehen die Elemente <xdr:graphicFrame>, <xdr:pic>, <xdr:sp>, <xdr:grpSp>, <xdr:cxnSp> oder <xdr:contentPart> zur Verfügung.

Soll ein Diagramm platziert werden, wird ein <xdr:graphicFrame>-Element eingefügt. Das Element <xdr:pic> verweist dagegen auf eine zu platzierende Bilddatei. Die anderen Elemente fügen unter anderem Formen oder Textrahmen ein und werden daher hier nicht weiter beschrieben.

Graphic Frame

Neben Diagrammen kann der Graphic Frame u.a. auch SmartArt-Grafiken enthalten, die hier jedoch nicht behandelt werden. Folgendes Beispiel zeigt wie ein <xdr:graphicFrame>-Element aufgebaut ist, das ein Diagramm enthält:

<xdr:graphicFrame>
  <xdr:nvGraphicFramePr>
    <xdr:cNvPr id="2" name="Diagramm 1"/>
    <xdr:cNvGraphicFramePr/>
  </xdr:nvGraphicFramePr>
  <xdr:xfrm/>
  <a:graphic>
    <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart">
      <c:chart r:id="rId1"/>
    </a:graphicData>
  </a:graphic>
</xdr:graphicFrame>

Entscheidend ist hier das Element <a:graphic> bzw. dessen Kindelement <a:graphicData>, das ein Relationship zu einem anderen Part aufbaut. Das <a:graphicData>-Element gibt bereits mit dem uri-Attribut einen Indikator für die Art des Inhalts. Hier wird der Namensraum-URI des Wurzelelements des referenzierten Parts angegeben.

Das enthaltene Element gehört bereits diesem Namensraum an. Für Diagramme ist es das Element <c:chart> im Namensraum schemas.openxmlformats.org/drawingml/2006/chart. Neben den notwendigen Namensraum-Definitionen erhält das <c:chart>-Element das Attribut r:id, das auf ein Relationship im zugehörigen Relationship-Part verweist. Dieses referenziert, wie bereits beschrieben, den entsprechenden chart-Part.

Bild-Objekt

Wird an Stelle eines Graphic Frames ein <xdr:pic>-Element eingefügt, fügt der Rahmen eine Bildgrafik ein. Anhand des folgenden Beispiels soll aufgezeigt werden, wie ein Bild platziert wird:

<xdr:pic>
  <xdr:nvPicPr>
    <xdr:cNvPr id="2" name="Grafik 2"/>
    <xdr:cNvPicPr/>
  </xdr:nvPicPr>
  <xdr:blipFill>
    <a:blip r:embed="rId2" cstate="print"/>
    <a:stretch/>
  </xdr:blipFill>
  <xdr:spPr>
    <a:prstGeom prst="rect"/>
  </xdr:spPr>
</xdr:pic>

Auch hier wollen wir nur die wichtigsten Elemente betrachten. Mit dem <a:blip>-Element innerhalb des <xdr:blibFill>-Elements wird wieder eine Relationship zu einem anderen Part aufgebaut. In diesem Fall verweist das r:embed-Attribut auf das entsprechende Relationship im zugehörigen Relationship-Part, das den image-Part referenziert.

 

Diagramme

Abb. 13: Screenshot der Standard-Diagrammarten in Excel

Abb.13: Screenshot der Standard-Diagrammarten in Excel

Diagramme lassen sich in verschiedene Arten gliedern, z.B. Säulen-, Punkt-, Liniendiagramm, etc. Auch in Excel wird eine solche Gliederung vorgenommen. Dieser Artikel soll sich auf die Standard-Diagrammarten (siehe Abb. 13) beschränken, 3D-Diagramme wollen wir zunächst außen vor lassen. Im Folgenden sollen zunächst die gemeinsam verwendeten Strukturen beschrieben, danach anhand des Liniendiagramms die artspezifischen Strukturen eines Diagrammes dargestellt und anschließend, anhand der Unterschiede zum Liniendiagramm, die weiteren Standard-Diagramme beschrieben werden.

Strukturelle Betrachtung

Abb. 14: Bereiche eines Diagrammes

Abb. 14: Bereiche eines Diagrammes

Ein Diagramm lässt sich in verschiedene Bereiche teilen (siehe Abb. 14):

  • Titel

  • Legende

  • Plot-Area

Nur auf der Diagramm-Matrix werden die Daten graphisch dargestellt. Anhand der unterschiedlichen Darstellung der Daten können die Diagramme u.a. in folgende Arten gegliedert werden:

  • Säulendiagramm

  • Liniendiagramm

  • Balkendiagramm

  • Punktdiagramm

  • Flächendiagramm

  • Kreisdiagramm

  • ...

In den anderen Bereichen, also Legende, Titel und Achsen, unterscheiden sich die Diagrammarten im Wesentlichen nicht. Daher werden auch im XML-Code die gleichen Strukturen angewandt. Eine Ausnahme bildet das Kreisdiagramm, das über keine Achsen verfügt.

Die dargestellten Daten in einem Diagramm müssen in Datenreihen gegliedert werden. Eine Datenreihe besteht aus beliebig vielen Werten oder Wertpaaren in einer festen Reihenfolge, die aber auch je nach Diagrammart ignoriert werden kann. Bis auf das Kreisdiagramm können alle genannten Diagramme beliebig viele Datenreihen darstellen. Das Kreisdiagramm dagegen stellt immer nur eine Datenreihe dar.

Struktureller Aufbau in DrawingML

An die vorstehende strukturelle Betrachtung erinnert auch der Aufbau des chart-Parts, der für die Darstellung eines Diagrammes in DrawingML zuständig ist:

<c:chartSpace>
  <c:chart>
    <c:title>
               [...]
    </c:title>
    <c:plotArea>
               [...]
    </c:plotArea>
    <c:legend>
               [...]
    </c:legend>
  </c:chart>
     [...]
</c:chartSpace> 

Jedes Kindelement des <c:chart>-Elements steht für einen Bereich des Diagramms (Abb.14). Den Elementnamen entsprechend steht das Element <c:title> für den Titel, <c:plotArea> für die Plot-Area und <c:legend> für die Legende. Einziges Pflicht-Element ist das <c:plotArea>-Element. Wird kein <c:legend>- oder kein <c:title>-Element eingefügt, wird der entsprechende Bereich weggelassen.

Legende

Ist das <c:legend>-Element leer, wird die Legende automatisch erzeugt und platziert. Da die Legende in den meisten Fällen automatisch anhand der vom Diagramm dargestellten Daten generiert wird und nur manuelle Eingriffe in DrawingML beschrieben werden, beschränken wir uns auf die Platzierung der Legende. Hierzu erhält das <c:legend>-Element die Kindelemente <c:legendPos> und <c:layout>.

Bereich zur Positionierung

Das <c:legendPos>-Element ist stets leer und gibt mit dem val-Attribut die Positionierung in Bezug auf die Plot-Area (<c:plotArea>) an. Es kann so festgelegt werden, dass die Legende rechts (r), links (l), oberhalb (t) oder unterhalb (b) bzw. oberhalb rechts (tr) von der Plot-Area platziert wird. Die Angabe sorgt nicht nur für eine Default-Platzierung der Legende, sofern mit dem <c:layout>-Element nichts Anderes angegeben ist. Entscheidender ist, dass abhängig von dieser Angabe von der Plot-Area automatisch der notwendige Platz für die Legende eingeräumt wird. Wird also angegeben, dass die Legende rechts von der Plot-Area platziert werden soll (<c:legendPos val="r"/>), erstreckt sich die Plot-Area nicht über die gesamte Breite des äußeren Rahmens, sondern lässt rechts von der Area einen Bereich frei, der so breit ist, dass die Legende darauf platziert werden kann. Dies gilt jedoch nur, wenn die Plot-Area automatisch platziert wird.

Abb. 15: Positionierung der Legende rechts oben

Abb. 15: Positionierung der Legende rechts oben

Ohne weitere Angabe wird die Legende sowohl vertikal als auch horizontal zentriert auf diesem Bereich platziert. Entsprechend gilt dies für die anderen Möglichkeiten der Positionierung der Legende. Dabei ist jedoch die Angabe <c:legendPos val="tr"/> eine Ausnahme, da hier sowohl der Bereich rechts von der Plot-Area freigelassen wird als auch der Bereich oberhalb. Die Legende wird nun standardmäßig innerhalb des rechteckigen Bereiches platziert, der sich von der rechten oberen Ecke der Plot-Area zur rechten oberen Ecke des äußeren Rahmens erstreckt (siehe Abb. 15).

Manuelle Positionierung

Zur manuellen Positionierung enthält das <c:layout>-Element ein Element <c:manualLayout>:

<c:legend>
  <c:legendPos val="r"/>
  <c:layout>
    <c:manualLayout>
      <c:xMode val="edge"/>
      <c:yMode val="edge"/>
      <c:x val="0.80"/>
      <c:y val="0.40"/>
      <c:w val="0.20"/>
      <c:h val="0.20"/>
    </c:manualLayout>
  </c:layout>
</c:legend>

Die Elemente <c:xMode> und <c:yMode> sollen zunächst ignoriert werden, da sie nur eine absolute Positionierung vom linken und oberen Rand des äußeren Rahmens aus garantieren. Die Attributwerte der val-Attribute sind jeweils Faktoren, die sich auf die Breite (bei <c:x> und <c:w>) bzw. Höhe (<c:y> und <c:h>) dieses Rahmens beziehen. Das val-Attribut des <c:x>-Elements gibt so den Abstand der Legende zum linken Rand des Rahmens an, das des <c:y>-Elements den zum oberen Rand, das des <c:w>-Elements die Breite und das des <c:h>-Elements die Höhe der Legende (Abb. 17):

Abb. 16: Positionierung der Legende mittels Faktoren

Abb. 16: Positionierung der Legende mittels Faktoren

Enthält das Element <c:manualLayout> kein <c:><w>- oder kein <c:><h>-Element, wird die Breite bzw. Höhe der Legende anhand des Inhaltes der Legende ermittelt. Fehlt ein <c:x> oder ein <c:y>, wird die horizontale bzw. vertikale Position von der bereits beschriebenen Default-Position (abhängig vom <c:legendPos>-Element) übernommen.

Wird in den val-Attributen der Elemente <c:xMode> und <c:yMode> an Stelle des Wertes edge der Wert factor angegeben, wird die Positionierung nicht mehr zwangsläufig vom linken und oberen Rand des Rahmens angegeben, sondern ist abhängig von der Angabe beim <c:legendPos>. Das etwas eigenwillige Verhalten bei dieser Einstellung soll wegen mangelnder Relevanz hier nicht beschrieben werden.

Titel

Wie bei der Legende erzeugt ein leeres <c:title>-Element einen Default-Titel (in Excel: Diagrammtitel), der automatisch platziert wird. Soll er manuell positioniert werden, kann das <c:title>-Element ein Kindelement <c:layout> erhalten. Die Positionierung durch dieses Element erfolgt analog zur Legende.

Eingeräumter Bereich

An Stelle des <c:legendPos>-Elements erhält das <c:title>-Element ein <c:overlay>-Element. Im entsprechenden val-Attribut erhält dieses Element einen booleschen Wert. Mit den Werten 0 bzw. false wird dem Titel oberhalb der Plot-Area der notwendige Platz eingeräumt. Dagegen überlappen sich die Bereiche des Titels und der Plot-Area bei den Werten 1 bzw. true. Der eingeräumte Bereich ist immer oberhalb der Plot-Area. Die Einstellung des <c:overlay>-Elements wird ebenfalls nur berücksichtigt, wenn die Plot-Area nicht manuell positioniert wird.

Titel-Content

Für den Inhalt des Titels ist das <c:tx>-Element zuständig und kann auf zwei Arten bestimmt werden. Entweder es wird ein fixer Text als Titel oder eine Referenz auf eine Zelle angegeben. Nachfolgend sollen beide Arten in kurzer Form aufgezeigt werden.

Titel durch fixen Text

Für einen fixen Text erhält das <c:tx>-Element ein <c:rich>-Kindelement. Dessen Inhaltsmodell lehnt sich an WordML-Strukturen an:

<c:title>
  <c:tx>
    <c:rich>
      <a:bodyPr/>
      <a:p>
        <a:r>
          <a:t>Diagrammtitel</a:t>
        </a:r>
      </a:p>
    </c:rich>
  </c:tx>
  <c:layout/>
</c:title>

Das <a:p>-Element steht für einen Absatz, das <a:r>-Element gliedert den Absatztext in gleich formatierte Abschnitte und das <a:t>-Element enthält diese Textabschnitte. Diese Struktur realisiert inzeilige Formatierungen von Textabschnitten. Auch hier wollen wir auf die Beschreibung inzeiliger Formatierungen verzichten.

Titel durch eine Referenz

Erhält das <c:tx>-Element an Stelle des <c:rich>-Elements ein <c:strRef>-Kindelement, wird eine Referenz erzeugt. Hierzu muss in dem Kindelement <c:f> ein Verweis auf eine Zelle angegeben werden bzw. eine Excel-Formel, die den Titel berechnet:

<c:tx>
  <c:strRef>
    <c:f>Tabelle1!A1</c:f>
  </c:strRef>
</c:tx>

Entscheidend ist hier, dass der Verweis auf eine Zelle in jedem Fall mit Angabe des Namens des Tabellenblattes erfolgen muss. Eigentlich ist dies in einer Excel-Formel nur notwendig, wenn auf eine Zelle eines anderen Tabellenblattes verwiesen werden soll. Bei Diagrammen jedoch gelten nur solche absoluten Angaben. Die allgemeine Notation lautet dabei: Tabellenblattname!Zellenname. Im obigen Beispiel ist demnach Tabelle1 der Tabellenblattname und die Zelle A1 dieses Tabellenblattes die referenzierte Zelle.

Plot-Area

Die Plot-Area lässt sich wie bereits beschrieben in Matrix und Achsen untergliedern. Neben dem diagrammartspezifischen Element für die Matrix, erhält somit das <c:plotArea>-Element <c:valAx>- bzw. <c:catAx>-Elemente für die Achsen. Zuzüglich wird die Positionierung der Plot-Area mit einem weiteren <c:layout>-Element beschrieben:

<c:plotArea>
  <c:layout>
          [...]
  </c:layout>
     [Element zur Beschreibung der Matrix]
  <c:catAx>
          [...]
  </c:catAx>
  <c:valAx>
          [...]
  </c:valAx>
</c:plotArea>

Positionierung

Die Positionierung der Plot-Area erfolgt analog zur Positionierung der Legende. Der einzige Unterschied besteht darin, dass das <c:manualLayout>-Element für eine Plot-Area zusätzlich ein <c:layoutTarget>-Element enthalten kann:

<c:layout>
  <c:manualLayout>
    <c:layoutTarget val="inner"/>
          [...übliche Positionierung analog zum c:legend-Element...]
  </c:manualLayout>
</c:layout>

Abb. 17: Vergleich äußere (l) und innere (r) Grenzen der Plot-Area

Abb. 17: Vergleich äußere (l) und innere (r) Grenzen der Plot-Area

Mit dem Wert des val-Attributs wird bestimmt, ob die Positionierung sich auf die inneren (inner) oder äußeren (outer) Grenzen der Plot-Area bezieht. Die äußeren Grenzen schließen auch die Achsen inklusive Beschriftung ein, während der Bereich, den die inneren Grenzen einschließen, nur die Matrix des Diagrammes enthält.

Achsen

Ein Diagramm hat gewöhnlich zwei Achsen, kann aber auch noch über weitere verfügen. Dabei wird grundsätzlich zwischen verschiedenen Achsenarten unterschieden. DrawingML unterscheidet, neben spezielleren Achsen (z.B. Datums-Achse), zwischen numerischen Achsen (<c:valAx>-Element) und kategorischen Achsen (<c:catAx>).

Eine kategorische Achse wird diskontinuierlich skaliert. Jede Kategorie erhält einen gleichgroßen Achsenabschnitt. Die Reihenfolge der Kategorien ist dabei ungeordnet. Eine numerische Achse dagegen hat eine kontinuierliche Skalierung  und kann demnach in beliebig kleine Schritte skaliert werden. Während ein Eintrag in das Diagramm bei einer kategorischen Achse anhand einer zugehörigen Kategorie genau einem Achsenabschnitt zugeordnet wird, erfolgt die Zuordnung bei einer numerischen Achse anhand eines numerischen Wertes.

Ein Säulendiagramm verfügt somit in der Horizontalen über eine kategorische und in der Vertikalen über eine numerische Achse. Ein Punktdiagramm unterscheidet sich von einem Säulendiagramm, indem es zwei numerische Achsen hat. Ein Balkendiagramm unterscheidet sich vom Säulendiagramm dadurch, dass es in der Horizontalen die numerische und in der Vertikalen die kategorische Achse hat.

Kategorische Achse

Wie bereits erwähnt, definiert das <c:catAx>- im <c:plotArea>-Element eine kategorische Achse:

<c:catAx>
  <c:axId val="74518912"/>
  <c:scaling>
    <c:orientation val="minMax"/>
  </c:scaling>
  <c:axPos val="b"/>
  <c:crossAx val="74521216"/>
</c:catAx>

Das <c:axID>-Element weist der Achse mit dem val-Attribut eine ID zu, die verwendet wird, um auf diese Achse zu referenzieren. Das <c:scaling>-Element bestimmt die Skalierung der Achse. Es kann u.a. das Element <c:orientation> enthalten. Es gibt mit dem val-Attribut die Ausrichtung der Achse mit den beiden möglichen Werten minMax und maxMin an. Ersterer bestimmt, dass die Kategorien in der Reihenfolge auf der Achse sortiert werden, in der sie angegeben sind, während Letzterer eine umgekehrte Reihenfolge hervorruft.

Die zwei weiteren obligatorischen Elemente im <c:catAx>-Element sind das <c:axPos>- und das <c:crossAx>-Element. Das Element <c:axPos> soll mit dem val-Attribut die Position der Achse angeben, also ob sie oberhalb (t), unterhalb (b), rechts (r) oder links (l) von der Diagramm-Matrix platziert wird. Allerdings scheint diese Angabe bisher keine entdeckten Auswirkungen in der Darstellung des Excel-Programmes zu haben. Scheinbar ist die Position der Achsen abhängig von der gewählten Diagrammart. Mit dem <c:crossAx>-Element wird ebenfalls über das val-Attribut die Achse angegeben, mit der sich diese Achse kreuzt. Der Attributwert ist dabei die ID der gekreuzten Achse.

Numerische Achse

Durch das <c:valAx>-Element wird bereits angegeben, dass es sich bei der Achse um eine numerische Achse handelt. In den hier behandelten Elementen unterscheidet sich das Inhaltsmodell der numerischen Achse nicht von dem der kategorischen:

<c:valAx>
  <c:axId val="74521216"/>
  <c:scaling>
    <c:orientation val="minMax"/>
  </c:scaling>
  <c:axPos val="l"/>
  <c:crossAx val="74518912"/>
</c:valAx> 

Liniendiagramm

Abb. 18: Liniendiagramm

Abb. 18: Liniendiagramm

Ein Liniendiagramm hat in Excel in der Horizontalen eine kategorische Achse (x-Achse) und in der Vertikalen eine numerische Achse (y-Achse). Jeder Wert wird als Punkt in die Diagramm-Matrix eingetragen: In der Horizontalen wird er der entsprechenden Kategorie zugeordnet, in der Vertikalen einer Höhe, die dem Wert auf der y-Achse entspricht. Die Kategorie der Werte wird in Excel anhand ihrer Reihenfolge in der Datenreihe bestimmt, so dass jeder Kategorie nur ein Wert zugeordnet wird. Die Punkte werden in der Standarddarstellung mit einer Linie verbunden, daher wird diese Art des Diagramms Liniendiagramm genannt. Jedoch ist es auch möglich, die Datenreihen als nicht miteinander verbundene Punkte darzustellen.

Aufbau

Das <c:plotArea>-Element muss somit ein <c:catAx>- und ein <c:valAx>- Element enthalten. Als signifikantes Element für die Diagrammart enthält es ein <c:lineChart>-Element:

<c:plotArea>
  <c:layout/>
  <c:lineChart>
    <c:grouping val="standard"/>
    <c:ser>[...]</c:ser>
    <c:ser>[...]</c:ser>
    <c:ser>[...]</c:ser>
    <c:axId val="73934720"/>
    <c:axId val="73936256"/>
  </c:lineChart>
  <c:catAx>
    <c:axId val="73934720"/>
          [...]
  </c:catAx>
  <c:valAx>
    <c:axId val="73936256"/>
          [...]
  </c:valAx>
</c:plotArea>

Für jede Datenreihe enthält das <c:lineChart>- ein <c:ser>-Element. Zudem wird hier eine Referenz auf jede Achse mit dem <c:axId>-Element angegeben. Die Referenz erfolgt über die ID, die bereits im <c:catAx>- bzw. <c:valAx>-Element definiert wurde. Dabei ist die Reihenfolge der Referenzen entscheidend: Für eine korrekte Darstellung muss zunächst die x-Achse, dann die y-Achse referenziert werden.

Das <c:grouping>-Element kann hier mit dem val-Attribut verschiedene Einstellungen wählen. Die Bedeutung der Werte sind in der Tabelle 8 aufgezeigt:

Attributwert

Bedeutung

standard

Die Werte werden wie bereits beschrieben in das Diagramm eingetragen.

stacked

Die Werte werden für jede Kategorie aufsummiert eingetragen. Dies bedeutet für die erste Datenreihe keine Veränderung. Für die folgenden Datenreihen wird jedem Wert die Summe der Werte aller vorstehenden Datenreihen, die der gleichen Kategorie zugeordnet sind, hinzu addiert. Hierbei ist die Reihenfolge der Datenreihen entscheidend. Wie diese bestimmt wird, soll später erläutert werden.

Die letzte Datenreihe hat hier in jeder Kategorie die Summe aller Werte, die dieser Kategorie zugeordnet werden.

percentStacked

Wie bei der Einstellung stacked werden die Werte für jede Kategorie aufsummiert. Hier wird nur der prozentuale Anteil des aufsummierten Wertes an der Summe aller Werte, die dieser Kategorie zugeordnet sind, eingetragen. Die letzte Datenreihe hat hier in jeder Kategorie 100 %.

Tabelle: Bedeutung der Werte für das val-Attribut des <c:grouping>-Elements

Datenreihe

Das <c:ser>-Element erhält mit dem val-Attribut des <c:idx>-Elements einen Index. Im Vergleich mit den anderen Datenreihen entsteht so eine Reihenfolge der Datenreihen. Auswirkungen dieser Reihenfolge wurden bereits beschrieben. Andere sind beispielsweise die Erzeugung des Default-Namens der Reihe (Datenreihen 1, Datenreihen 2 usw.). Eine ähnliche Funktion soll das obligatorische <c:order>-Element haben, jedoch ist kein Einfluss auf die Darstellung sichtbar. Es bleibt daher unklar, welche genaue Funktion dieses Element haben soll. Den übrigen Aufbau zeigt folgendes Beispiel:

<c:ser>
  <c:idx val="0"/>
  <c:order val="0"/>
  <c:cat>
    <c:strRef><c:f>Tabelle1!A2:A6</c:f></c:strRef>
  </c:cat>
  <c:val>
    <c:numRef><c:f>Tabelle1!B2:B6</c:f></c:numRef>
  </c:val>
</c:ser>
<c:ser>
  <c:idx val="1"/>
  <c:order val="1"/>
  <c:val>
    <c:numLit>
      <c:pt idx="0">
        <c:v>1</c:v>
      </c:pt>
      <c:pt idx="1">
        <c:v>2</c:v>
      </c:pt>
               [...]
    </c:numLit>
  </c:val>
</c:ser>
<c:ser>
  <c:idx val="2"/>
  <c:order val="2"/>
     [...]
</c:ser>

Werte der Datenreihe

Für die Werte der Datenreihe erhält das <c:ser>-Element ein <c:val>-Element, in dem auf verschiedene Weisen die Werte angegeben werden können. Zum einen können die Werte anhand einer Referenz auf einen Zellenbereich bestimmt werden (wie im ersten <c:ser>-Element des Beispiels), zum anderen können die Werte im XML-Code fest angegeben werden (wie für die zweite Datenreihe).

Zur Unterscheidung wird für die Referenz das Element <c:numRef> und für die fixe Angabe <c:numLit> verwendet. Im Ersteren wird in einem <c:f>-Element mit einer Excel-Formel der Zellenbereich angegeben. Dieser Bereich muss ebenfalls absolut angegeben werden. Der Zellenbereich darf entweder nur Zellen einer Zeile oder einer Spalte umfassen. Die Reihenfolge der Werte für die Datenreihe ergibt sich aus dem Zellenbereich: von links nach rechts bzw. von oben nach unten. Die Reihenfolge für dieses Beispiel wäre: B2, B3, B4, B5, B6.

Das <c:numLit>-Element enthält für jeden Wert ein <c:pt>-Element mit einem idx-Attribut, das den Index des Wertes innerhalb der Datenreihe angibt und einem Kindelement <c:v>, das den entsprechenden Wert enthält.

Bestimmung der Kategorien

Zur Bestimmung der Kategorien erhält mindestens eine Datenreihe ein <c:cat>-Element. Dabei wird nur das <c:cat>-Element berücksichtigt, dessen Datenreihe den niedrigsten Index hat. Das Inhaltsmodell des <c:cat>-Elements ähnelt dem des <c:val>-Elements. Auch hier können die Kategorien über eine Referenz oder fixe Werte bestimmt werden. Jedoch unterscheidet die Struktur auch zwischen Kategorien numerischen Typs und Kategorien vom Typ String.

Bei numerischen Kategorien können ebenfalls die Elemente <c:numRef> und <c:numLit> in gleicher Weise verwendet werden. Für Kategorien vom Typ String stehen die Elemente <c:strRef> und <c:strLit> zur Verfügung. Das <c:strRef>-Element enthält dabei eine Referenz auf Zellen analog zum <c:numRef>-Element und das <c:strLit>-Element enthält wie das <c:numLit>-Element <c:pt>-Elemente für fixe Kategorien.

Datenreihenname

Zur Bestimmung des Namens einer Datenreihe, der beispielsweise in der Legende verwendet wird, kann das <c:ser>-Element ein Kindelement <c:tx> enthalten:

<c:ser>
  <c:idx val="0"/>
  <c:order val="0"/>
  <c:tx>
    <c:strRef>
      <c:f>Tabelle1!C1</c:f>
    </c:strRef>
  </c:tx>
     [...]
</c:ser>

Das <c:tx>-Element kann ebenfalls mit einem <c:strRef>-Element auf den Inhalt einer Zelle verweisen. Alternativ kann es ein Kindelement <c:v> haben, das mit einem fixen String den Namen festlegt.

Flächendiagramm

Ein Flächendiagramm in Excel unterscheidet sich nur in der Darstellung von einem Liniendiagramm. Der einzige Unterschied hierbei ist, dass die Fläche unterhalb der Linie bis zur x-Achse farblich ausgefüllt wird.

In DrawingML unterscheidet sich ein Flächendiagramm von der Struktur eines Liniendiagrammes hauptsächlich anhand des signifikanten Elementes: An Stelle des <c:lineChart>-Elements hat ein Flächendiagramm ein umschließendes <c:areaChart>-Element:

<c:areaChart>
  <c:grouping val="standard"/>
  <c:ser>[...]</c:ser>
  <c:ser>[...]</c:ser>
  <c:ser>[...]</c:ser>
  <c:axId val="73143040"/>
  <c:axId val="73144576"/>
</c:areaChart>

Zu beachten ist, dass Datenreihen mit niedrigerem Index von den Flächen der Datenreihen mit höherem Index in der Darstellung überdeckt werden.

Säulendiagramm

Abb. 19: Säulendiagramm

Abb. 19: Säulendiagramm

Auch ein Säulendiagramm gleicht in Bezug auf die Art und Anordnung der Achsen sowie in Bezug auf das Eintragen der Werte in die Matrix dem Liniendiagramm. Ein Unterschied ist, dass die eingetragenen Punkte nicht mit einer Linie verbunden werden, sondern eine Säule in Form eines schmalen Rechtecks, das von der x-Achse zum Punkt reicht, visualisiert werden. Die Höhe des Rechtecks entspricht somit dem Wert auf der y-Achse. Die Breite dagegen ist beliebig und bei allen Werten gleich. Während die Punkte einer Kategorie in einem Liniendiagramm genau auf einer vertikal verlaufenden Achse liegen, sind zur besseren Unterscheidung die Säulen in einer Kategorie in der Horizontalen leicht versetzt, so dass keine Säule eine andere überdeckt.

Aufbau

Das signifikante Element für ein Säulendiagramm ist das <c:barChart>-Element:

<c:barChart>
  <c:barDir val="col"/>
     [...]
</c:barChart>

Zur Unterscheidung vom Balkendiagramm, das ebenfalls das <c:barChart>-Element verwendet, erhält es ein Kindelement <c:barDir> mit den möglichen Werten col und bar für das val-Attribut. Ersterer steht für ein Säulen-, Letzterer für ein Balkendiagramm.

Aufgrund der strukturellen Äquivalenz zwischen Säulendiagramm und Liniendiagramm gibt es kaum weitere Unterschiede in DrawingML. Die oben beschriebenen Kindelemente des <c:lineChart>-Elements gelten auch für das Element <c:barChart>.

Balkendiagramm

Wie bereits angedeutet, sind Balken- und Säulendiagramme eng verwandt. Genau genommen gibt es nur einen rein perspektivischen Unterschied. Während bei einem Säulendiagramm die x-Achse die kategorische ist und die y-Achse die numerische, ist dies beim Balkendiagramm genau umgekehrt. Ein Balkendiagramm ist folglich ein um 90° gedrehtes Säulendiagramm.

Entsprechend ist der einzige Unterschied zwischen den beiden Diagrammen in DrawingML der Wert im val-Attribut des <c:barDir>-Elements (bar).

Kreisdiagramm

Ein Kreisdiagramm stellt immer nur eine Datenreihe dar und verfügt über keine Achsen. Dabei werden die Werte der Datenreihe anhand ihres Anteils an der Summe aller Datenreihen-Werte dargestellt. Zur Visualisierung der unterschiedlichen Anteile wird ein Kreis in entsprechend große Sektoren aufgeteilt. Jeder Sektor wird einem Wert der Datenreihe zugeordnet. Die Größe eines Sektors im Verhältnis zur Größe des Kreises veranschaulicht den Anteil des Datenreihen-Werts.

Die Werte der Datenreihe werden zugehörigen Kategorien zugeordnet. Die Anzeige der Kategorie eines Sektors kann durch eine Legende erfolgen.

Da ein Kreisdiagramm über eine Datenreihe verfügt, die eine Werte-Sequenz enthält und dieser Kategorien zugeordnet werden, unterscheidet sich die Struktur in DrawingML in den wichtigsten Elementen nicht von der eines Liniendiagramms:

<c:plotArea>
  <c:pieChart>
    <c:varyColors val="1"/>
    <c:ser>
      <c:idx val="1"/>
      <c:order val="0"/>
      <c:tx>[...]</c:tx>
      <c:cat>[...]</c:cat>
      <c:val>[...]</c:val>
    </c:ser>
  </c:pieChart>
</c:plotArea>

Wie zu sehen ist, enthält die Plot-Area bei einem Kreisdiagramm keine Achsen-Elemente. Das <c:pieChart>-Element ist das signifikante Element für das Kreisdiagramm. Entsprechend enthält es auch keine <c:axId>- und nur ein <c:ser>-Element. Ansonsten ist das <c:varyColors>-Element zu erwähnen, das mit einem booleschen Wert im val-Attribut angibt, ob die Flächen der Kreissektoren mit der gleichen Farbe (0 bzw. false) oder mit unterschiedlichen Farben (1 bzw. true) gefüllt werden sollen.

Punktdiagramm

Neben dem Kreisdiagramm ist das Punktdiagramm das einzige Standarddiagramm, das sich strukturell von den vorstehend beschriebenen Diagrammen stärker unterscheidet. Ein Punktdiagramm verfügt sowohl in der Horizontalen als auch in der Vertikalen über eine numerische Achse. Die Datenreihen bestehen aus Wertepaaren, die jeweils aus einem x- und einem y-Wert bestehen. Ein Punkt kann also anhand des x- und y-Wertes in die Diagramm-Matrix eingetragen werden. Da sowohl in der Horizontalen als auch in der Vertikalen die Position eines Punktes anhand eines Wertes und nicht einer Kategorie bestimmt wird, gibt es keine fixe Reihenfolge der Wertepaare.

Abb. 20: Erzeugung von Wertepaaren für ein Punktdiagramm

Abb. 20: Erzeugung von Wertepaaren für ein Punktdiagramm

In Excel wird die Sequenz der Wertepaare, die einer Datenreihe zugeordnet sind, durch zwei separate Werte-Sequenzen angegeben (siehe Abb. 20): eine für die x-Werte und eine für die y-Werte. Die beiden Sequenzen werden nun so zusammengeführt, dass Wertepaare entstehen. Dabei ist die Reihenfolge innerhalb der Werte-Sequenzen entscheidend. Der erste x-Wert und der erste y-Wert ergeben das erste Wertepaar in der Datenreihe.

Aufbau

Das signifikante Element für das Punktdiagramm ist das <c:scatterChart>-Element:

<c:scatterChart>
  <c:scatterStyle val="line"/>
  <c:ser>[...]</c:ser>
  <c:ser>[...]</c:ser>
  <c:axId val="77213056"/>
  <c:axId val="79689216"/>
</c:scatterChart>

An Stelle des <c:grouping>-Elements enthält dieses ein Element <c:scatterStyle>. Es soll angeben, wie die Darstellung der Datenreihen ist: z.B. nur durch Punkte (marker), durch eine Linie verbunden (line) oder durch eine geglättete Linie (smooth). Jedoch scheint die Angabe keinerlei Auswirkungen auf die tatsächliche Darstellung in Excel zu haben. Die Punkte werden stets durch eine (nicht geglättete) Linie verbunden.

Ansonsten kann das <c:scatter><Chart>-Element ebenfalls beliebig viele <c:ser>- und zwei <c:axId>-Elemente enthalten, wobei Erstere für eine Datenreihe stehen und Letztere auf zwei numerische Achsen verweisen müssen. Das erste <c:axId>-Element verweist dabei ebenfalls auf die x-Achse, das zweite auf die y-Achse.

Datenreihe

Dadurch, dass eine Datenreihe nun eine Wertepaar-Sequenz bzw., wie oben beschrieben, zwei Werte-Sequenzen enthalten muss, ändert sich die Struktur der Datenreihe (<c:ser>) im Vergleich zu den vorstehenden Diagrammen, deren Datenreihen jeweils nur eine Werte-Sequenz enthalten.

<c:ser>
  <c:idx val="0"/>
  <c:order val="0"/>
  <c:tx>[...]</c:tx>
  <c:xVal>
    <c:numRef><c:f>Tabelle1!B2:B6</c:f></c:numRef>
  </c:xVal>
  <c:yVal>
    <c:numRef><c:f>Tabelle1!C2:C6</c:f></c:numRef>
  </c:yVal>
</c:ser>

Die Elemente <c:idx>, <c:order> und <c:tx> sind noch identisch mit der bereits beschriebenen Datenreihe. Anstelle eines <c:val>-Elements werden hier nun jeweils ein <c:xVal>- und ein <c:yVal>-Element verwendet. Den Elementnamen entsprechend bestimmt ersteres Element die Werte-Sequenz für die x-Werte und letzteres die für die y-Werte. Auch hier stehen, wie bei dem <c:val>-Element, die Kindelemente <c:numRef> und <c:numLit> für einen Verweis auf entsprechende Zellen bzw. der fixen Angabe der Werte zur Verfügung.

 

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