offie报表设计(.net)
一、 概述
由于OFFICE软件在办公软件业的垄断,Office文件格式也在报表文件格式占有相当重要的地位。在商业软件或企业开发中,我们经常会遇到生成Office报表的问题。
解决这个问题的方法有几种:
l 利用Office Automation的方法直接生成OFFICE文档;
l 利用ADO.NET的方法对Excel文件以数据源的方式读写;
l 利用第三方法插件(Crystal Report)开发。
以上几种各有利弊,而难于达到精确的格式的要求。故根据OFFICE 2003的新特性,我设计一种基于.NET Framework的OFFICE报表生成方法。
这种方法的优点:
l 能够支持格式较复杂的报表;
l 在执行效率也具有相当的优势;
l 使用的技术相对简单(.Net Framework、XML、Office Automation);
l 以后技术发展的趋势(XML技术)。
当然,这种方法也有不少的缺点:
l 不支持图表功能(在Office 12中应该得以改进);
l 没有可视化的工具编辑XSLT,使得开发流程相当耗时,尤其是对XSLT不太了解时;
l 需要对Office 2003的XML格式有所了解,这点可以参照Microsoft提供的Microsoft Office 2003 XML Reference Schemas Documentation。
综上所述,本方案应该是利弊参半。所以,本文也非向大家推销此方法,旨在以解决方案的形式,给大家作个参考。
二、 实施
上面对此方法作了概述,但未涉及技术实现,所以现在我想谈一下具体的实现方法。
本方案主要用到XML,要求读者对XML和.NET平台上的XML操作要有一定的认识。如果对这方面有兴趣的朋友可以http://www.w3.org了解一下XML和Microsoft发布的.NET Framework SDK文档了解一下XML在.Net Framework上的应用及其操作方法。
cd.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!--<! Edited with XML Spy v2007 (http://www.altova.com)>-->
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary Moore</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Eros</TITLE>
<ARTIST>Eros Ramazzotti</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>BMG</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>One night only</TITLE>
<ARTIST>Bee Gees</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1998</YEAR>
</CD>
<CD>
<TITLE>Sylvias Mother</TITLE>
<ARTIST>Dr.Hook</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>8.10</PRICE>
<YEAR>1973</YEAR>
</CD>
<CD>
<TITLE>Maggie May</TITLE>
<ARTIST>Rod Stewart</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Pickwick</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Romanza</TITLE>
<ARTIST>Andrea Bocelli</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>When a man loves a woman</TITLE>
<ARTIST>Percy Sledge</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Black angel</TITLE>
<ARTIST>Savage Rose</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Mega</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
<CD>
<TITLE>Soulsville</TITLE>
<ARTIST>Jorn Hoel</ARTIST>
<COUNTRY>Norway</COUNTRY>
<COMPANY>WEA</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Stop</TITLE>
<ARTIST>Sam Brown</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>A and M</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Bridge of Spies</TITLE>
<ARTIST>T'Pau</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Siren</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Private Dancer</TITLE>
<ARTIST>Tina Turner</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Capitol</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Midt om natten</TITLE>
<ARTIST>Kim Larsen</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Medley</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Pavarotti Gala Concert</TITLE>
<ARTIST>Luciano Pavarotti</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>DECCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1991</YEAR>
</CD>
<CD>
<TITLE>The dock of the bay</TITLE>
<ARTIST>Otis Redding</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Picture book</TITLE>
<ARTIST>Simply Red</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Elektra</COMPANY>
<PRICE>7.20</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Red</TITLE>
<ARTIST>The Communards</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>London</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Unchain my heart</TITLE>
<ARTIST>Joe Cocker</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>EMI</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1987</YEAR>
</CD>
</CATALOG>
2. 编写Office XML的XSLT。实现这一步的技巧,由于Office XML的代码很繁琐(动辄数千行),你可以先用Office制作模板,然后将其另存为“XML表格”,这样便可以得到大概的Office XML代码,再在其基础上修改。代码实现如下:
cd.xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<!--
This is an XSLT template file. Fill in this area with the
XSL elements which will transform your XML to XHTML.
-->
<h2>My CD Collection</h2>
<table border="1">
<thead>
<tr>
<th colspan="6">This is my CD collection</th>
</tr>
</thead>
<tr bgcolor="#9acd32">
<th align="left">TITLE</th>
<th align="left">ARTIST</th>
<th align="left">COUNTRY</th>
<th align="left">COMPANY</th>
<th align="left">PRICE</th>
<th align="left">YEAR</th>
</tr>
<xsl:for-each select="CATALOG/CD">
<tr>
<td>
<xsl:value-of select="TITLE" />
</td>
<td>
<xsl:value-of select="ARTIST" />
</td>
<td>
<xsl:value-of select="COUNTRY" />
</td>
<td>
<xsl:value-of select="COMPANY" />
</td>
<td>
<xsl:value-of select="PRICE" />
</td>
<td>
<xsl:value-of select="YEAR" />
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
3. 利用.NET Framework提供XslTransform类以第一步生成的XML文档作为数据,以第3步生成的XSLT文件作为模板,生成Office 2003 XML格式的XML文件。如果您的客户用的是Office 2003或上的版本,那么生成的文档直接可以被正确地读取,否则,请接着实施下一步。代码实现如下:
Response.ContentType = "application/vnd.ms-excel";
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF8;
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=backup.xls");
StringWriter sw = new StringWriter();
System.Xml.XPath.XPathDocument doc = new System.Xml.XPath.XPathDocument(Server.MapPath("cd.xml"));
XslTransform trans = new XslTransform();
trans.Load(Server.MapPath("cd.xsl"));
trans.Transform(doc, null, sw, null);
HttpContext.Current.Response.Write(sw.ToString());
HttpContext.Current.Response.End();
三、 总结
随着XML技术的发展和普及,我相信该方案可以支持更多的格式的报表生成如PDF等。
浙公网安备 33010602011771号