Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

pc:excelxslt

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
pc/excelxslt.txt · Zuletzt geändert: 2017/02/10 08:33 von admin