转Excel的一种简单方法


本文示例源代码或素材下载

  写了这么久的程序﹐越来越喜欢那种简单的解决方法﹐这段时间在做一个报表系统﹐其中有需要转Excel﹐而且要求兼容openoffice﹐遂利用asp语法,asp.net的控件封装特性以及excel 2003的xml试算清格式做了一个看起来比较"清爽"的excel转档方案。

  一.开始

  原理很简单﹐excel2003增加了一种xml电子表格的格式﹐如下﹕

1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook
4 xmlns="urn:schemas-microsoft-com:office:spreadsheet"
5 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
6 <Worksheet ss:Name="Sheet1">
7 <Table>
8  <Row>
9   <Cell ss:MergeAcross="1"><Data ss:Type="String">Excel xml</Data></Cell>
10  </Row>
11  <Row>
12  <Cell><Data ss:Type="String">A2</Data></Cell>
13  <Cell><Data ss:Type="Number">0.112</Data></Cell>
14  </Row>
15 </Table>
16 </Worksheet>
17</Workbook>

  将这段代码存成xml或xls的后缀﹐excel都能正确打开﹐当然openoffice则只能存成xml的后缀。

  因此我们只要输出一个这样的文字文件就行。

  但是如果要I/O操作﹐写一个这样的文字文件出来﹐还是比较烦琐的﹐因此直接利用aspx的特性:

  在aspx.cs中写到﹕

1 protected void Page_Load(object sender, EventArgs e)
2  {
3     Response.Clear();
4    Response.ContentType = "application/vnd.ms-excel";
5    string excelname = "ExcelReport";  
6    Response.AddHeader("content-disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(excelname, System.Text.Encoding.UTF8) + ".xml");
7  }
8

  而在aspx中则只要填入上上面那段代码﹐当然<%@ Page Language="C#"

  AutoEventWireup="true" CodeFile="ExcelExport.aspx.cs" Inherits="ExcelExport" %>不要忘喽﹐这样在直接访问aspx时﹐就能够下载一个excel档案了。

  二.模板语言

  尽管asp的<%语法被很多人诟病﹐说是意大利面条﹐其实任何技术都有其适用范围﹐只要心中有刀...

  asp的<%=%>和<% %>很适于UI的制作﹐可能有些TX没有接触过asp﹐简单讲一下﹐在aspx文件中是可以直接写代码的﹐不要类﹐方法﹐就是顺序执行﹐如

1<%
2DateTime now = DateTime.Now;
3%>
4你好﹐现在是<%=now.ToString("yyyy/MM/dd HH:mm:ss")%>

  这样就完成了一个动态的页面。将上面的代码存成一个aspx﹐访问一下就可以看

  到效果了。

  回过头来﹐asp语法输出一个DataSet的代码如下(Source可以在aspx.cs中设置为一个属性﹐然后从这里取)﹕

1<%@ Import Namespace="System.Data" %>
2 <Worksheet ss:Name="<%=SheetName%>">
3 <Table>
4  <%
5    if (Source != null && Source.Tables.Count > 0 && Source.Tables[0].Rows.Count > 0)
6    {
7      foreach (DataRow dr in Source.Tables[0].Rows)
8      {
9        %>
10        <Row>
11        <%
12        foreach (object data in dr.ItemArray)
13        {
14          %>
15          <Cell><Data ss:Type="String"><%=data.ToString()%></Data></Cell>
16          <%
17        }//end for each cell
18        %>
19        </Row>
20        <%
21      }//end for each row
22    }//end if Source is null
23    else
24    {
25    %>
26    <Row><Cell><Data ss:Type="String">sorry no data</Data></Cell></Row>
27    <% 
28    }
29  %>
30 </Table>
31 </Worksheet>

呵呵﹐千万别把什么都放到<% %>来喽﹐否则﹐那些骂asp的人可能又有战场了。

  只有与view有关的东西才到这里来,切记切记。

  用这种方法﹐写文字文件可谓..

  三.asp.net也要隆重上场了。

  asp.net多了一个东西,ascx﹐这个东西除了它的"常规用法"外﹐也有一些"歪门邪道"﹐看招﹕

  aspx:

1<%@ Page Language="C#" AutoEventWireup="true" 
2CodeFile="ExcelExport.aspx.cs" Inherits="ExcelExport" %>
3<%@ Register Src="Sheet3.ascx" TagName="Sheet3" TagPrefix="uc2" %>
4<?xml version="1.0"?>
5<?mso-application progid="Excel.Sheet"?>
6<Workbook
7 xmlns="urn:schemas-microsoft-com:office:spreadsheet"
8 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
9<%
10for(int i=0;i<3;i++){
11%>
12<uc2:Sheet3 ID="Sheet3_1" SheetName="Sheet<%=(i+1)%>" runat="server" />
13<%
14}
15%>
16</Workbook>

  ascx:

1<Worksheet ss:Name="<%=SheetName%>">
2 <Table>
3  <Row>
4  <Cell><Data ss:Type="String">简单的sheet表页</Data></Cell>
5  </Row>
6 </Table>
7 </Worksheet>


  ascx.cs:

1string _sheetName = "default";
2
3  public string SheetName
4  {
5    get
6    {
7      return _sheetName;
8    }
9    set
10    {
11      _sheetName = value;
12    }
13  }

  出来就是三个sheet表喽﹐用这个东西﹐可是封装的好方法呀﹐如何发挥它的效果﹐大家可以发挥想象力...

  最后﹐还是要说明一下这种方式的优缺点﹕

  优点﹕

  1简单﹐搭配asp.net的模板输出引擎﹐直接完成档案输出﹐不需要任何的I/O操作和额外进程资源。

  2.兼容OpenOffice﹐ 一般的OpenOffice都支持此种格式﹐基本上不需要作任何修改(部分格式如自动筛选可能不支持)

  3.对各种Sheet表格式的支持充分(如居中﹐框线﹐合并﹐金额数字﹐条件格式﹐排序﹐筛选等)

  缺点﹕

  1.不支持Excel2003以下版本﹐如ExcelXP,Excel2000,Excel97

  2.不能转出图表,图片

  3.当Excel中的xml格式设置错误时﹐除错可能麻烦一些﹐但是Excel会提供出错log﹐根据经验﹐这个log还是基本上能指明出错点的

  适用范围﹕在客户端是openoffice或基本能保证Excel2003﹐且报表一般都为固定格式(如财报)或只有数据输出的场合比较适用。

  顺便说一句﹐我很少用什么水晶报表呀﹐reporting service呀﹐原因是我喜欢自

  己管控一切﹐我的user很刁(曾经有一个﹐它就要在报表上就是对某个数字要求能够单击时﹐能alert一下﹐hello﹐你好)﹐但是我﹐呵呵... 不怕!



相关阅读:
复杂检索数据并分页显示的处理方法
sp_executesql 使用复杂的Unicode 表达式错误的解决方法
jQuery使用手册之二 DOM操作
Asp.net Mvc Framework 三 (Controller与View)
Flash页面如何通过校验
Oracle的RBO和CBO
oracle行转列组合成字符串函数
让Vista和XP共享临时文件夹!
构建你的网站新闻自动发布系统之三
查询同一表内多字段同时重复记录的SQL语句
使用PHPeclipse和xampp开发PHP
Oracle查询指定记录数的奇怪问题
Servlet写入Cookie转发后无法读取的问题
SQLServer2005 Output子句获取刚插入的ID值
快速导航

Copyright © 2016 phpStudy |