本文介紹利用Excel軟件生成格式,提取和精簡(jiǎn)之后制作成xslt文件,將xml導(dǎo)入,以xslt為模板,生成新的Excel文件的過(guò)程。
序:
最近在給客戶(hù)做一個(gè)管理系統(tǒng)的時(shí)候,客戶(hù)提出要將查詢(xún)結(jié)果導(dǎo)出到Excel。對(duì)于還是實(shí)習(xí)生的我倍感壓力,于是找了點(diǎn)資料。網(wǎng)上有個(gè)示例,其中方法十分簡(jiǎn)單。于是照貓畫(huà)虎,把方法和心得與大家分享。OK,Let`s go
第一步:
創(chuàng)建一個(gè)Excel文件(就是 普通的Excel),在第一個(gè)單元格輸入“city”,然后選擇“另存為”,此時(shí)彈出保存窗口。注意:將保持格式選擇為“XML 表格(*.xml)”,點(diǎn)擊保存。完畢后用記事本打開(kāi)這個(gè)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>
其實(shí)這個(gè)就是將XML轉(zhuǎn)換成Excel最關(guān)鍵的部分。實(shí)際上這就是Excel對(duì)應(yīng)的XML格式。也就是說(shuō)按照這個(gè)格式來(lái)寫(xiě)一個(gè)XML文件,然后用Excel打開(kāi),Excel會(huì)將這個(gè)文件以Excel的樣子正確的現(xiàn)實(shí)出來(lái)。
第二步:
在.net項(xiàng)目中添加一個(gè)xslt文件。學(xué)過(guò)xslt的朋友都知道通過(guò)xslt可以將xml轉(zhuǎn)換成其他的格式。可能有的朋友還沒(méi)有理解我的意思。其實(shí)我們通過(guò)xslt將xml轉(zhuǎn)換成“第一步”中的格式,然后保存或者輸出到客戶(hù)端就完成了導(dǎo)出Excel的功能了。
對(duì)于第一步中的XML代碼我們要進(jìn)行一些修改,因?yàn)檫@是Excel自動(dòng)生成的,其中包含了大量的無(wú)用信息。修改后的代碼如下:
<?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>
到目前為止,這個(gè)代碼還沒(méi)有實(shí)際的用處。我們將這個(gè)代碼copy到創(chuàng)建的xslt文件中,并將xslt的一些語(yǔ)法加入到上面的代碼中,最后xslt文件將是這個(gè)樣子:
<?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>
保存這個(gè)xslt文件。
第三步:
編寫(xiě).net后臺(tái)代碼,我是通過(guò)一個(gè)按鈕事件觸發(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é):
其實(shí)這個(gè)方法的核心就是利用.net的xslt轉(zhuǎn)換功能將xml以一種特殊格式輸出出去。而這種格式可以利用Excel軟件自動(dòng)生成