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等。

posted on 2007-04-16 11:31  bravel  阅读(377)  评论(0)    收藏  举报