ASP.NET使用xslt将xml转换成Excel
程序员文章站
2023-12-16 13:49:16
序:
最近在给客户做一个管理系统的时候,客户提出要将查询结果导出到excel。对于还是实习生的我倍感压力,于是找了点资料。网上有个示例,其中方法十分简单。于是照猫画虎...
序:
最近在给客户做一个管理系统的时候,客户提出要将查询结果导出到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软件自动生成