随笔-80  评论-383  文章-17  trackbacks-7

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

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

        数据的读取的问题虽然解决了,怎样呈现出来呢?我们知道,在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 阅读(6255) 评论(29)  编辑 收藏 网摘 所属分类: 编程/技术

评论:
#1楼 2005-09-01 20:46 | 铱星      
不错,研究一下

这位仁兄这两天频频发表文章啊,厉害

  回复  引用  查看    
#2楼 2005-09-01 21:04 | 铱星      
能不能就这个流程做个Demo啊?这个思路挺实用的
  回复  引用  查看    
#3楼 2005-09-02 08:32 |       
这里有一个重要的关键点是:Excel本身可以直接读取数据库的数据或可转为Html直接Show给用户,但不能回存。
1、BI:一般使用Excel透视表显示多维数据
2、图表:采用COM+控制Excel生成Excel文件或HTML
(从通用角度讲,应避开DSO的客户端ActiveX控件问题)

  回复  引用  查看    
#4楼[楼主] 2005-09-02 09:34 | Dragonpro      
客户端用自定义ActiveX的确不是最好的解决方案,这需要调整IE的安全属性,希望有更多经验的朋友能提供更好的办法
  回复  引用  查看    
#5楼 2005-09-02 10:02 | ....[未注册用户]
每个单元格填充Excel的方式太烂了
  回复  引用    
#6楼[楼主] 2005-09-02 13:19 | Dragonpro      
单元格填充方式的确不好,但我忘了我在什么地方看过解决方法,现在找不到了,因为每个单元格填充会损失很多填充时间,好像还可以Arraylist填充,由于时间关系,我也没时间去钻研这个了,有更好的填充方式不妨放上来,大家交流交流嘛。
  回复  引用  查看    
#7楼 2005-10-28 14:24 | gaojixin[未注册用户]
为什么WORD的打印预览后,按下关闭就死机啊!还是我的机器有问题了?请指教!谢谢
  回复  引用    
#8楼 2005-10-31 00:44 | antgao[未注册用户]
不错,怎么直接保存到服务器上呀
  回复  引用    
#9楼[楼主] 2005-11-04 11:11 | Dragonpro      
需要IIS设置相应的目录为可写
  回复  引用  查看    
#10楼[楼主] 2005-11-04 11:19 | Dragonpro      
TO:gaojixin

应该是机器的问题,我们的机器没遇到过类似的情况。

  回复  引用  查看    
#11楼 2006-01-04 09:35 | dw[未注册用户]
我用DSO提取了服务器上的WORD文件(WORD文件已经存在),显示出来为只读,怎么解决这个问题呀
  回复  引用    
#12楼 2006-01-04 09:54 | liuqiang[未注册用户]
用这个控件把文档上传到domino的数据中要怎么实现啊?
  回复  引用    
#13楼[楼主] 2006-01-05 00:47 | Dragonpro      
@dw:
只读没关系,应为是在服务器上区得的文件,一样可以保存到服务器或是另存为,如果你觉得这个只读文字不好看可以隐藏标题栏或是修改那个源代码。

@liuqiang
没研究过domino,不过这些都需要服务器开放可写的权限,在这里可以把文件名用GUID来命名,可以防止文件被恶意窜改,当然也可以用报存到本地再上传的方式,这可能要用到xmlhttp了,具体的还要看业务是怎样的。

  回复  引用  查看    
#14楼 2006-04-03 11:45 | anchky      
好东西!

  回复  引用  查看    
#15楼 2006-07-31 17:14 | 454541651[未注册用户]
如何能把dsoframer控件修改成交本安全的控件,现在默认安全级别下控件会被禁止。
  回复  引用    
#16楼 2006-12-01 21:56 | kitche[未注册用户]
请问下,要是准备在客户端用这个ocx并且客户端没用安装word,有什么办法部署word的com组件使得这个ocx能打开word文档?
  回复  引用    
#17楼 2006-12-10 10:57 | lixinghuasea[未注册用户]
你好:
我现在有一些问题,就是在DSO Framer OCX 中怎样实现,对Word或Excel不可改,谢谢您了。
lixinghuasea@163.com
李星华(上)

  回复  引用    
#18楼 2007-03-23 09:53 | dsoframers[未注册用户]
excel server 不是很好么?
  回复  引用    
#19楼 2007-03-23 09:54 | dsoframers[未注册用户]
我现在有一些问题,就是在DSO Framer OCX 中怎样实现,对Word或Excel不可改,谢谢您了。
--------------------重载EXCEL对象及方法,再利用Excel自身的保护机制,实现文档的保护.

  回复  引用    
#20楼 2007-03-23 09:58 | dsoframers[未注册用户]
请问下,要是准备在客户端用这个ocx并且客户端没用安装word,有什么办法部署word的com组件使得这个ocx能打开word文档?
-----------参考下微软的OWC.

  回复  引用    
#21楼 2007-03-23 10:01 | dsoframers[未注册用户]
如何能把dsoframer控件修改成交本安全的控件,现在默认安全级别下控件会被禁止。
-----------给控件进行数字签名即可.

  回复  引用    
#22楼 2007-03-23 10:02 | dsoframers[未注册用户]
MS给的版本问题


MS给的版本,使用“ActiveX控件测试容器”测试,退出后会出现一个错误的报告,请问这是什么错误?如何解决~^0^

  回复  引用    
#23楼 2008-04-08 09:13 | 任浩杰[未注册用户]
楼主写的太好了,最近也在忙这些东西,楼主能否给我传份源代码,谢谢了,我的邮箱是renhaoj2008@126.com,特别是关于英文的File菜单改为中文那部分
  回复  引用    
#24楼 2008-08-25 22:19 | 4s2t2w[未注册用户]
今天偶然看到,太好了。我也想要#23说的内容,能给一份吗?
  回复  引用    
#25楼 2009-01-09 16:15 | w[未注册用户]
fuck
  回复  引用    
#26楼 2009-06-03 14:30 | 大傻瓜      
hello,你的代码,我下了,和我原有的一份效果是一样的,,在本机用那个测试包,可以保存到服务器,
但是有个问题,就是如果把那个测试包发布了之后,如果再打开服务器上的word的时候,就说是什么url无效等等,,总之是没有打开word,很是郁闷!!!!
不知道这个怎么解决,盼望斑竹及早回复,,,头儿逼得实在么办法,,
代码又看不懂,,,,!!!!!

  回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 228144




相关文章:

相关链接:

Free Web Counter