序:
最近在給客戶做一個管理系統的時候,客戶提出要將查詢結果匯出到Excel。對於還是實習生的我倍感壓力,於是找了點資料。網上有個樣本,其中方法十分簡單。於是照貓畫虎,把方法和心得與大家分享。OK,Let`s go
第一步:
建立一個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轉換成Excel最關鍵的部分。實際上這就是Excel對應的XML格式。也就是說按照這個格式來寫一個XML檔案,然後用Excel開啟,Excel會將這個檔案以Excel的樣子正確的現實出來。
第二步:
在.net項目中添加一個xslt檔案。學過xslt的朋友都知道通過xslt可以將xml轉換成其他的格式。可能有的朋友還沒有理解我的意思。其實我們通過xslt將xml轉換成“第一步”中的格式,然後儲存或者輸出到用戶端就完成了匯出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到建立的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後台代碼,我是通過一個按鈕事件觸發匯出的。代碼如下:
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();}
總結:
其實這個方法的核心就是利用.net的xslt轉換功能將xml以一種特殊格式輸出出去。而這種格式可以利用Excel軟體自動產生