ASP.NET使用xslt將xml轉(zhuǎn)換成Excel

字號:


    本文介紹利用Excel軟件生成格式,提取和精簡之后制作成xslt文件,將xml導(dǎo)入,以xslt為模板,生成新的Excel文件的過程。
    序:
    最近在給客戶做一個管理系統(tǒng)的時候,客戶提出要將查詢結(jié)果導(dǎo)出到Excel。對于還是實習生的我倍感壓力,于是找了點資料。網(wǎng)上有個示例,其中方法十分簡單。于是照貓畫虎,把方法和心得與大家分享。OK,Let`s go
    第一步:
    創(chuàng)建一個Excel文件(就是 普通的Excel),在第一個單元格輸入“city”,然后選擇“另存為”,此時彈出保存窗口。注意:將保持格式選擇為“XML 表格(*.xml)”,點擊保存。完畢后用記事本打開這個Excel文件。你將看到如下的代碼
    <?xml version="1.0"?>
    <?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">
    <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
    <Author>MC SYSTEM</Author>
    <LastAuthor>MC SYSTEM</LastAuthor>
    <Created>2009-05-28T16:20:57Z</Created>
    <Company>MC SYSTEM</Company>
    <Version>11.5606</Version>
    </DocumentProperties>
    <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
    <WindowHeight>11250</WindowHeight>
    <WindowWidth>18180</WindowWidth>
    <WindowTopX>120</WindowTopX>
    <WindowTopY>75</WindowTopY>
    <ProtectStructure>False</ProtectStructure>
    <ProtectWindows>False</ProtectWindows>
    </ExcelWorkbook>
    <Styles>
    <Style ss:ID="Default" ss:Name="Normal">
    <Alignment ss:Vertical="Center"/>
    <Borders/>
    <Font ss:FontName="宋體" x:CharSet="134" ss:Size="12"/>
    <Interior/>
    <NumberFormat/>
    <Protection/>
    </Style>
    </Styles>
    <Worksheet ss:Name="Sheet1">
    <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
    x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
    <Row ss:>
    <Cell><Data ss:Type="String">org</Data></Cell>
    </Row>
    </Table>
    <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
    <Unsynced/>
    <Selected/>
    <Panes>
    <Pane>
    <Number>3</Number>
    <ActiveRow>3</ActiveRow>
    <ActiveCol>1</ActiveCol>
    </Pane>
    </Panes>
    <ProtectObjects>False</ProtectObjects>
    <ProtectScenarios>False</ProtectScenarios>
    </WorksheetOptions>
    </Worksheet>
    <Worksheet ss:Name="Sheet2">
    <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
    x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
    <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
    <Unsynced/>
    <ProtectObjects>False</ProtectObjects>
    <ProtectScenarios>False</ProtectScenarios>
    </WorksheetOptions>
    </Worksheet>
    <Worksheet ss:Name="Sheet3">
    <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
    x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
    <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
    <Unsynced/>
    <ProtectObjects>False</ProtectObjects>
    <ProtectScenarios>False</ProtectScenarios>
    </WorksheetOptions>
    </Worksheet>
    </Workbook>
    其實這個就是將XML轉(zhuǎn)換成Excel最關(guān)鍵的部分。實際上這就是Excel對應(yīng)的XML格式。也就是說按照這個格式來寫一個XML文件,然后用Excel打開,Excel會將這個文件以Excel的樣子正確的現(xiàn)實出來。
    第二步:
    在.net項目中添加一個xslt文件。學過xslt的朋友都知道通過xslt可以將xml轉(zhuǎn)換成其他的格式。可能有的朋友還沒有理解我的意思。其實我們通過xslt將xml轉(zhuǎn)換成“第一步”中的格式,然后保存或者輸出到客戶端就完成了導(dǎo)出Excel的功能了。
    對于第一步中的XML代碼我們要進行一些修改,因為這是Excel自動生成的,其中包含了大量的無用信息。修改后的代碼如下:
    <?xml version="1.0"?>
     <?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">
     <Worksheet ss:Name="Sheet1">
      <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
        x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
        <Row ss:>
          <Cell>
          <Data ss:Type="String">
            city <!--還記得嗎?這是第一步中輸入的city -->
          </Data>
         </Cell>
        </Row>
      </Table>
     </Worksheet>
     </Workbook>
    到目前為止,這個代碼還沒有實際的用處。我們將這個代碼copy到創(chuàng)建的xslt文件中,并將xslt的一些語法加入到上面的代碼中,最后xslt文件將是這個樣子:
    <?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">
      <Worksheet ss:Name="Sheet1">
        <Table>
          <xsl:for-each select="*">
           <Row>
            <Cell>
            <Data ss:Type="String">
              <xsl:value-of select="."/>
            </Data>
           </Cell>
            <Cell>
            <Data ss:Type="String">
               <xsl:value-of select="."/>
            </Data>
           </Cell>
          </Row>
         </xsl:for-each>
        </Table>
      </Worksheet>
      </Workbook>
     </xsl:template>
    </xsl:stylesheet>
    保存這個xslt文件。
    第三步:
    編寫.net后臺代碼,我是通過一個按鈕事件觸發(fā)導(dǎo)出的。代碼如下:
    private void button1_Click(object sender, EventArgs e)
    {
     XmlDocument xdoc = new XmlDocument();
     xdoc.LoadXml("<records><record><org>北京</org></record></records>");
     XslCompiledTransform xct = new XslCompiledTransform();
     xct.Load(Application.StartupPath+"\\excel.xslt");
     XmlTextWriter writer = new XmlTextWriter("output.xls", null);
     writer.WriteProcessingInstruction("xml", "version="1.0"");
     xct.Transform(xdoc, null,writer);
     writer.Close();
    }
    總結(jié):
    其實這個方法的核心就是利用.net的xslt轉(zhuǎn)換功能將xml以一種特殊格式輸出出去。而這種格式可以利用Excel軟件自動生成