欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET使用xslt将xml转换成Excel

程序员文章站 2024-02-10 15:35:10
序:   最近在给客户做一个管理系统的时候,客户提出要将查询结果导出到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软件自动生成