随笔-81  评论-381  文章-17 

在B/S中用DSO Framer OCX + Excel 解决复杂的报表问题

        在实际的企业级应用中,很容易遇到需要处理复杂报表的问题,因为报表一般都相对复杂,用一般的表单+字段的方式实在不方便,怎样做更省劲呢?

        我们知道,报表数据一般都是取数据库里的数据再加上复杂的处理,这些处理都是直接与数据本身交互的,与我们的系统逻辑关系不大,所以,完全可以放在存储过程中来做,不需要太多关心逻辑处理。这样我们的存储过程就相当于一个黑盒子,如果需要报表数据,传入相应的参数直接运行即可,它负责返回我们想要的数据集。

        数据的读取的问题虽然解决了,怎样呈现出来呢?我们知道,在BS结构中要表现复杂的多维数据并不是很容易的事情,况且一般报表不仅需要显示而且用户需要修改,存档等这些与用户交互,如果我们用传统的表+字段的方式来做那么可以想象工作量是多么的大。经验告诉我们,微软的Excel使用很普及,而且在处理数据方面还有独到的方便之处,我们何不用Excel来显示数据呢,但是问题又来了,用Excel面临着两个问题,一方面在BS结构中处理CS程序是一个并不太方便的事情,另一方面是数据怎样填充到Excel之中去。那么带着这几个问题一个一个来解决好了^_^。

        要整合这些问题,下面的图示为一种解决方案:


    
以下就针对这种方式来说明此种解决方案

第一个问题(DSO Framer相关问题):

微软其实给我们做了很好的ActiveX控件,名叫DSO Framer大概意思就是文档对象框架,也就是可以根据我们的文档对象来加载我们的处理程序,此控件可以打开常用的Office文档,具体支持的文档一方面要看客户机器上安装的Office组件另外一个本软件只支持常用的Office文档比如不支持Visio等,具体的可以down一个下来看看。那么这么好一个免费工具不是很好吗,OK微软的东西我们应该试试。

此控件的使用:此控件不仅全源码提供(VC6),而且还提供了Demo,我们要使用参照里面的Demo即可,但还有几点需要说明:

1.         要测试ActiveX控件里的方法可以用VS.NET自带的ActiveX控件测试容器这个工具,在工具菜单里有,比较好用哦,比如要屏蔽菜单项等等都可以在这里找到答案。

2.         此控件最新版本应该是1.2版本,此版本仍然有个问题,主要是保存到服务器上的功能有不能解锁的问题从而不能保存到服务器,别急,我可以提供修改后的版本,这个还是我在圆子里找到的解决方法,而且我把原来的英文的File菜单改为中文了,稍后提供此源码。

3.         在创建文件和编辑文件的时候要用不同的方式打开,在创建文件的时候,也就是磁盘上没有文件的时候我们保存没有问题,但是我们在第二次打开的时候我们应该用只读的方式打开,因为只读的方式打开文件那么就不会锁住此文件,也就不存在由于文件被锁而不能覆盖文件的问题,这样我们在继续保存的时候才不会造成冲突。

关于这个控件我想就说到这里,有不明白的可以在下面回复,我尽量解答。

 

第二个问题(关于在服务器上操作Excel文件)

要在服务器上操作Excel文件,那么当然服务器必须要装呢Office Excel了,装了此软件后我们可以看到已经注册了一个Com组件,这个组件即为(以Office2003为例)Microsoft Excel 11.0 Object Labrary,添加了引用之后就是怎样处理Excel文档了。

       仅仅是处理Excel文档就可以单独拿出来研究,因为这个的问题是比复杂的,涉及到Com的引用,填充技术,进程的消除等等,在这里我不细说,只说说我的大概思路。

       我们可以知道,报表的格式繁多,我们必须制作相应的模板来适应各种报表风格,那么我们就必须为每种报表制作一个匹配的模板了。怎样来填充呢,我们可以注意到,填充模板可以使用存储过程执行后返回的DataSet来处理,我们可以针对指定的地方填充指定的DataTable,这需要我们在我们的配置程序里提供填充坐标这一项,那么我们可以根据坐标次序来填充存储过程返回的DataTable,而配置需要做的是指定开始点的坐标。

       这里需要注意的一点是,填充Excel的时候系统相当于打开Excel进程来处理Excel文件,而我们处理完了之后,进程并不会自动退出,当我们第二次需要处理的时候系统又会打开新的进程,从而造成进程越来越多,最终消耗尽系统资源。处理办法有两个,一个是当填充完后马上关闭进程,这需要强制关闭。第二种方法是建立进程池,当需要的时候在池里去取已有的进程,这样处理完后只需要把进程退回到进程池里即可。第一种可以保证系统资源的有效利用,而第二种方法可以提高执行效率,当然也是比较复杂的处理方式,我给的这个程序这两种方式可选,不知道还有没有更好的办法。

提供的这个DEMO的功能有:

a)         DataSet直接填充Excel模板,只要指定了相应的填充坐标数组,它就会自动填充到相应的位置

b)        支持分页,可以保证在数据较多的时候自动分页,自动出现分页信息

c)        填充速度尽量优化,在不是特别大数据的情况下速度应该可以接受

d)        支持Excel进程池,有效提高填充速度

e)         用户可以通过运行Demo方便的了解使用方法。

f)         此DEMO是在博客园网友的DEMO基础之上完善的

说得不够详尽,这个东西要说的太多了,有兴趣的朋友可以多交流交流。

下载DsoFramer修改版本

下载ExcelHelper完善版本
posted on 2005-09-01 19:19 dragonpro 阅读(...) 评论(...) 编辑 收藏

Free Web Counter