Excel per XSLT ausfüllen

(mal wieder massiv abgekupfert (diesmal von http://www.ksaelen.be/wordpresses/dynamicsaxblog/2009/08/using-c-xml-xslt-to-create-excel-spreadsheet/) und Bilder gegen Sourcen ausgetauscht)

Excel- Template erstellen

Zuerst bastelt man sich die Tabelle so, wie sie später aussehen soll

und benutzt als Speicherformat dann aber „XML- Kalkulationstabelle 2003 (*.xml)“

Das Template tunen

Wir öffnen das erzeugte Dokument mit einem (XML-) Editor unserer Wahl und hüllen das ganze Worksheet erstmal in ein Stylesheet- Tag (schliessende Tags am Ende nicht vergessen!)

<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> ... </Workbook> </xsl:template> </xsl:stylesheet>

suchen uns den Bereich mit der Tabelle und den einzelnen Zellen:

<Cell ss:StyleID="s63"><Data ss:Type="String">Quantity</Data></Cell> <Cell ss:StyleID="s63"><Data ss:Type="String">Part Type</Data></Cell> <Cell ss:StyleID="s63"><Data ss:Type="String">CPSC</Data></Cell> <Cell ss:StyleID="s63"><Data ss:Type="String">Sequence</Data></Cell> </Row> <Row> <Cell><Data ss:Type="String">Data 1</Data></Cell> <Cell><Data ss:Type="String">Data 2</Data></Cell> <Cell><Data ss:Type="String">Data 3</Data></Cell> <Cell><Data ss:Type="String">Data 4</Data></Cell> <Cell><Data ss:Type="String">Data 5</Data></Cell> <Cell><Data ss:Type="String">Data 6</Data></Cell> <Cell><Data ss:Type="String">Data 7</Data></Cell> <Cell><Data ss:Type="String">Data 8</Data></Cell> <Cell><Data ss:Type="String">Data 9</Data></Cell> <Cell><Data ss:Type="String">Data 10</Data></Cell> <Cell><Data ss:Type="String">Data 11</Data></Cell> <Cell><Data ss:Type="String">Data 12</Data></Cell> <Cell><Data ss:Type="String">Data 13</Data></Cell> </Row> </Table>

und ersetzen die gesamte Daten-„Row“ durch ein XSLT- Konstrukt, was dort dynamisch dann neue Datenreihen erzeugt:

... <Cell ss:StyleID="s63"><Data ss:Type="String">CPSC</Data></Cell> <Cell ss:StyleID="s63"><Data ss:Type="String">Sequence</Data></Cell> </Row> <xsl:for-each select="root/item"> <Row> <Cell> <Data ss:Type="String"> <xsl:value-of select="source" /> </Data> </Cell> .... .... <Cell> <Data ss:Type="String"> <xsl:value-of select="sequence" /> </Data> </Cell> </Row> </xsl:for-each> </Table>

Zum Schluss müssen wir noch in der Table Node das Attribut „ExpandedRowCount“ löschen, sonst will Excel das spätere Resultat nicht öffnen - siehe hier:

<Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="5" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">

Und weil die Datei ja nun ein XSLT- Template ist, speichern wir das mit der Endung *.xsl.

Tabelle mit Daten füllen

Nach der obigen Bearbeitung ist die fertige Datei nun eine ganz normale XSLT Transformationsanweisung und kann mit jedem der gängigen XSL- Transformationstools mit XML- Daten gefüllt werden; damit Excel allerdings beim Laden das Format akzeptiert, muss die Endung .xml sein.

Hier mal beispielhaft mit C#:

var myXslTrans = new XslCompiledTransform(); myXslTrans.Load("stylesheet.xsl"); myXslTrans.Transform("source.xml", "result.xml");

oder VB.NET:

With New XslCompiledTransform() .Load("stylesheet.xsl") .Transform("source.xml", "result.xml") End With