webreport

博客园 首页 新随笔 联系 订阅 管理
  38 Posts :: 0 Stories :: 237 Comments :: 37 Trackbacks
       自从n年前Excel击败Lotus,独霸电子表格软件市场以来。所有的表格类软件都不能不充分考虑Excel,寻找Excel照顾不到的功能点。所有的表格类软件都要被迫考虑和Excel兼容,能够导入导出Excel文件。实际结果就是,只要能和表格沾上边的软件无一不是在Excel的阴影下艰难度日。国内的web报表工具市场就更是如此,能不能很好地导入导出Excel文件,成了web报表工具软件的杀手锏。

      总之,能不能不失真地导入导出Excel文件,是决定web报表工具软件成败的大事。是大意不得的。

      实现导入导出Excel文件功能,大体有以下几类做法:

         1 只导出数据,不导出样式

         2 调用Excel软件中的com组件来导出

         3 用纯c#程序在二进制层面上读写excel文件

      第一种做法最简单,但功能最弱,基本上无法满足用户的要求。无法将样式导出是根本不会被用户接受的。

      第二种做法,我感觉是国内的.net平台上用得最多的一种。其原理就是利用MS Excel软件里的一组com组件来直接控制Excel文件,所以,这种做法是很依赖于Excel软件的。采用此法感觉也象正中微软的圈套。在.net程序(如c#)中,以这种做法来实现导入导出Excel文件,有以下的弱点:

       A  要求安装MS Excel软件。

       B  要求安装MS Excel软件的某些版本,或要求Excel软件的版本的统一性。

       C  MS Excelcom组件数量众多,内存等资源消耗太大。

       D  因为MS Excel是设计成一个有界面的电子表格软件,因而当在后台运行时也会因此而慢很多。

       因为.NET程序是通过COM组件的方式调用Excel,而.NET程序是托管的代码,它调用非托管的COM组件时(对于调用.NET的托管程序)会增加一些额外的开销。

       F  如果是利用服务器端的Excel软件的话,则会有无法彻底关掉服务器端的Excel进程的问题。我曾在博客园上看到很多用奇招杀掉服务器端的Excel进程的文章,但给我的感觉应是没能很好地彻底解决这个问题,也正因为此,才使我下决心不用这种方法来解决e表中的导入导出Excel文件问题。

      第三种做法,这种做法是不依赖Excel软件,即客户端和服务器端都不用安装Excel软件,直接用.NET程序(比如c#的程序)来读写Excel文件,即先将Excel文件以一个二进制文件流的方式读入到内存,然后根据Excel文件格式的标准来逐字节的分析。这种方法的好处是避免了第二种方法的弱点,对于Excel软件的依赖极小。但是,因为Excel文件的结构复杂,要用代码从头开始,逐字节地分析Excel文件,其工作量是非常大的。不象java平台,有一个通用且开源的POI包可以直接用来解决此问题。在.NET平台上,除了国外有一些商业化的DLL来解决此问题之外,国内好象见不着此类东西。我也试用过一些国外的,发现大多会有汉字问题。

       后来想想,对于导入导出Excel功能,大家大多是在报表工具(如水晶报表)中使用,或者是用第二种做法(即调用Excel中的COM组件)。又因为第三种做法工作量太大,所以大家就都避开它了。这就是当今的国情了。可是e表是没法避开它的。怎么办?只有再次象做纯页面的报表设计器哪样硬着头皮上了。

       要采用第三种做法,首先要找到Excel文件的格式说明文档,还是要感谢互联网的方便,很快就找来了excelfileformat.pdf 文件(为方便大家,点这里可以下载此文件)。下面给大家看看这个文件的开头,如图所示:

 

 

      当初找到这个文件我可高兴了,有了它,至少是可以干了。再一看,200多页,把它变成程序可真够呛。多看几篇后,发现格式都差不多,都类似下图:

 

      无非就是介绍每个字节的意义。

      终于硬着头皮将这些字节的意义都对象化了,即根据一个Excel文件的二进制流,根据这个文档,得到一个Excel文件的操作类库。全部是用纯C#语句写的,生成的ebExcel.dll文件一看,也不大,才200K。可源码挺多的,有近200.cs的文件。如下图所示:

 

      这个ebexcel.dll完成的功能就是提供一个强大而全面的操作Excel文件的类库,使用它可以在完全不依赖Excel软件的情况下读写各个版本的Excel文件,可以读写Excel文件的数据,公式,边框,样式,图片等等。此方法占有内存小,速度快,集成方便,功能定位明确,不光只用于web报表工具中,也可以很方便地把它用于各种需要读写Excel文件的场合,比如,需要从大量的Excel文件中自动提取数据保存到数据库的物理表中。

      e表有了ebexcel.dll,就可以很简单的实现不失真地导入Excel文件,即将Excel文件转换成e表格式的报表文件。也可以将报表运算结果导出为Excel文件,最重要的是在无须客户端或服务器端安装Excel软件的前提下。要使用读写Excel文件功能,非常简单,只需要将ebexcel.dll文件复制到bin目录即可。ebexcel.dll含在北京方成公司网站的e表试用版下载包中。
      

      想到还在为此问题而头痛的同胞们,也想过将ebExcel.dll免费开源给大家使用,但考虑到周方勇(网名:长江支流)免费开源的遭遇,只好等等再说吧!
      
      待续...

相关链接
[原创]web报表开发技术专题一:序号问题
[原创]web报表开发技术专题二:报表工具的核心---数据集的变换
web报表开发技术专题三:不规则分组和跨行组运算
web报表开发技术专题四:开发报表设计器的背后故事
web报表工具的制表效率分析


posted on 2007-07-19 10:19 web报表 阅读(5836) 评论(32)  编辑 收藏 网摘

Feedback

#1楼  2007-07-19 10:29 Lostinet      
既然是OPEN的..这个以后自然有人会写吧..?也许网上已经有代码了..
  回复  引用  查看    

#2楼  2007-07-19 10:30 小强 [未注册用户]
我这有十几种读写Excel的方法/控件,但功能都有限,不是只能读,就是只能写,要不就是Java或C++的,所以我决定翻译POI到C#,一个多月过去了,工作忙的缘故,只翻译了40多个文件....希望年内完成...
  回复  引用    

#3楼  2007-07-19 10:34 U2USoft      
好东西
  回复  引用  查看    

#4楼 [楼主] 2007-07-19 10:35 web报表      
@Lostinet
开始我以为在.NET平台上读写Excel文件,这么通用而明确的功能,网上肯定会有成熟的解决方法。google后的结果,令人大失所望,网上大多是些调用Excel软件中的COM组件的方法。只有国外有些,但都是要收费的。

  回复  引用  查看    

#5楼  2007-07-19 10:35 kiler      
也可以考虑研究研究openxml的文件格式,将来用的上。
  回复  引用  查看    

#6楼 [楼主] 2007-07-19 10:36 web报表      
@小强
希望你能坚持下去。

  回复  引用  查看    

#7楼  2007-07-19 10:37 小山猪 [未注册用户]
很好的程序啊。有可能开源就太好了
  回复  引用    

#8楼  2007-07-19 10:46 路过 [未注册用户]
office2003 以后不是支持 XML吗?
导出符合它的XML文件也可以啊

  回复  引用    

#9楼  2007-07-19 10:58 neuhawk      
用excel的xml格式
  回复  引用  查看    

#10楼  2007-07-19 10:59 neuhawk      
我有个想法,用根据excel的xml画出web和winform界面
  回复  引用  查看    

#11楼  2007-07-19 11:16 nZAI [未注册用户]
希望你早日把ebExcel.dll免费开源,这样我就不必再用cr的aspose.cells了
  回复  引用    

你以为你的那个真的有什么难度么,微软早就有了,在这蒙人! 该打
  回复  引用    

#13楼  2007-07-19 12:36 Cure      
园子里很早以前的文章,不知道怎么样:
http://www.cnblogs.com/unruledboy/archive/2004/07/07/22093.aspx

  回复  引用  查看    

#14楼  2007-07-19 12:53 kiler      
@sanshisong

你有看人家写的文章没?用微软的com组件操作excel机子上要office的。在服务器上装一个office可不是一件容易的事。微软对office编程的支持非常的烂。

  回复  引用  查看    

第一种也可以导出样式吧。
第二种没有用过。
还有一种吧,在客户端用vbscript控制excel,添加数据。

  回复  引用  查看    

#16楼  2007-07-19 13:19 birdshome      
@Lostinet
确实是有一个开源的biff8项目,我原来下来看过,cs文件一大堆,一下想不起来名字了。

  回复  引用  查看    

#17楼  2007-07-19 13:52 小强 [未注册用户]
@web报表
我现在列一下我所知道的方法,方便大家学习.
Java: Java上的 POI 就不多说了,在Apache官方网站可以找到.
另外一个就是JExcelAPI,好像是一韩国还是日本一猛人写的,但好像公式读取有问题,他的网站上还有一个写PDF库的东西,可以在google上G一下地址...
C#: koogra 只能读,但别人评价他效率很好,我测试过,确实不错...
SmartExcel 本来是 园子内一能人用VB.net写的后来又一能人翻译成了C#的,可以在园子"搜索"内找一下...
NExcel 是JExcelAPI的C#版本,但作者只翻译了读取部分,所以这个没有写Excel功能,版本好像还是阿尔法阶段...好久没有更新了..

C/C++ 的就不列了...

文章 中提到的2.1规范文件可以到Google内搜索
escher 搜索到,要不就搜索xlhtml,这个网站是C/C++读写Excel的一个开源站...

上面提到的 几个软件源码 在sf上搜索基本可以找到,SmartExcel 除外...


另外几个龌龊/卑鄙的方法提供.
1. VS2005 内提供一个 ReportViewer 控件可以导出到Excel..反编译源码 发现Microsoft.ReportingServices.Rendering.BIFFUtility 类库就是 写Excel 文件的关键代码...
2. 使用ikvm把Java的转化成.Net的...
3.反编译博主的"e表"中的ebexcel.dll,并破解,但好像混淆过了...
4.把C++ 读写Excel的DLL类库封装成.Net的..
5.反编译好多企业控件内的Excel处理部分,破解...
6.网上传疯了的DevExpress 7.1 控件源码内的打印导出到Excel部分,大概在DevExpress.Data\Export目录下ExportXls.cs文件内....
...
其他方法大家提供...

  回复  引用    

哈哈,excel,我都不怎么明白,嘿嘿
  回复  引用    

#19楼  2007-07-19 19:25 Cure      
@小强
真快啊,居然把楼主的都反编译过了:)

  回复  引用  查看    

#20楼  2007-07-20 02:09 visual [未注册用户]
I used ikvm.

Looks good

  回复  引用    

#21楼  2007-07-20 13:42 A.Z [未注册用户]
1,2,3(导入) 4(xml)
都用过了......lz好厉害,lz是那位数学系的吗?
希望开源......

  回复  引用    

#22楼  2007-08-03 18:54 LifeKiller      
关于这个excel操作类,我发现一些问题,例如,我制作一个Excel模板,已经设置好所有的列宽、打印页面设置,然后load这个模板,修改一些cell的数据,然后另存为另一个文件,这时我发现列宽发生了变化,我原来设置好的列宽被改变了。这个问题怎么解决?
  回复  引用  查看    

#23楼  2007-12-09 15:11 9527 [未注册用户]
忽悠,eform考虑的商业化,什么时候开源过,拿周方勇(网名:长江支流)免费开源的遭遇来说事,人家不是活得很好,比你eform影响力大。
  回复  引用    

这个excel操作类我也用过,不过貌似超过50行的excle就倒不出来了,最多只能导出或者导入50行
  回复  引用    

#25楼 [楼主] 2008-01-10 11:59 web报表      
@郁闷的人
这是e表试用版的限制.限制最多只能导入/导出50行.

  回复  引用  查看    

#26楼  2008-03-27 11:22 crazyant [未注册用户]
用web做Excel 报表确实是一个难题,如果实现在web页面里调用Excel,并可以通过编写代码对表中的数据进行任意读写,那么在开发的过程当中处理报表的工作就很简单了,直接在Web中使用Excel去做。下载一个第三方的SOAOFFICE控件,这个控件可以把Excel完美的嵌入到Web中,并且可以使用js脚本调用Excel的VBA接口(对VBA不熟悉的人可以使用这个控件已经封装好的EXCEL类),这个功能为我们修建了另一条解决Excel报表的道路,也是最好的解决方案了,因为客户本来就是想操作Excel,调用Excel本身比任何模拟Excel的方法都要好。
  回复  引用    

#27楼  2008-05-24 14:56 lxy0423 [未注册用户]
LZ的這個導入導出EXCEL功能確實很N. 兄弟pf中...

但LZ的ebexcel.dll這個類導出Xls文件,openoffice.org打不開,
而aspose.cells這個工具導出的xls文件,用openoffice.org是可以打開的.

不知道為何? 是破壞了xls文件標準格式了吧. 呵呵
如果LZ要商業化的話, 最好能支持Openoffice.org, 這樣市場更大些.
這點,還請lz放在心上, 如果支持openoffice.org的話, 我公司到可以shopping一下. 呵呵


  回复  引用    

#28楼  2008-11-28 23:44 joe-lau      
请头号ddl文人在哪
  回复  引用  查看    

#29楼  2008-11-28 23:44 joe-lau      
请问 ddl文件在哪下载
  回复  引用  查看    


发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: