轉Excel的一種簡單方法

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

将这段代码存成xmlxls的后缀﹐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:

 1 string  _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﹐你好)﹐但是我﹐呵呵... 不怕!

 

完整Demo 专案下载﹐浏览﹕ExcelExport.aspx

注﹕我的是繁体﹐如果出错﹐可以自己改一下

你可能感兴趣的:(Excel)