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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

将这段代码存成xml或xls的后缀﹐excel都能正确打开﹐当然openoffice则只能存成xml的后缀。
因此我们只要输出一个这样的文字文件就行。
但是如果要I/O操作﹐写一个这样的文字文件出来﹐还是比较烦琐的﹐因此直接利用aspx的特性:
在aspx.cs中写到﹕

2



3

4

5

6

7

8

而在aspx中则只要填入上上面那段代码﹐当然<%@ Page Language="C#"
AutoEventWireup="true" CodeFile="ExcelExport.aspx.cs" Inherits="ExcelExport" %>不要忘喽﹐这样在直接访问aspx时﹐就能够下载一个excel档案了。
二.模板语言
尽管asp的<%语法被很多人诟病﹐说是意大利面条﹐其实任何技朮都有其适用范围﹐只要心中有刀...
asp的<%=%>和<% %>很适于UI的制作﹐可能有些TX没有接触过asp﹐简单讲一下﹐在aspx文件中是可以直接写代码的﹐不要类﹐方法﹐就是顺序执行﹐如



2

3

4

这样就完成了一个动态的页面。将上面的代码存成一个aspx﹐访问一下就可以看
到效果了。
回过头来﹐asp语法输出一个DataSet的代码如下(Source可以在aspx.cs中设置为一个属性﹐然后从这里取)﹕



2

3

4



5

6

7

8

9

10

11



12

13

14

15

16



17

18

19

20



21

22

23

24

25

26


27



28

29

30

31

呵呵﹐千万别把什么都放到<% %>来喽﹐否则﹐那些骂asp的人可能又有战场了。
只有与view有关的东西才到这里来,切记切记。
用这种方法﹐写文字文件可谓..
三.asp.net也要隆重上场了。
asp.net多了一个东西,ascx﹐这个东西除了它的"常规用法"外﹐也有一些"歪门邪道"﹐看招﹕
aspx:



2

3



4

5

6

7

8

9



10

11

12

13



14

15

16

ascx:

2

3

4

5

6

7

ascx.cs:

2

3

4



5

6



7

8

9

10



11

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
注﹕我的是繁体﹐如果出错﹐可以自己改一下