.NET下的报表生成(三)

来源:互联网 发布:php实现图片高斯模糊 编辑:程序博客网 时间:2024/05/19 06:19

3、有效的Excel报表
企业应用经常依赖于Excel报表来与如JD Edwards一样的其他ERP系统进行交互。受到金融和直销影响的项目经常大量使用Excel表格。客户端环境下的Excel自动操作经常使用Excel对象。但是这个部分主要关注的是如何在ASP.NET环境下更好的使用Excel。
在服务器端使用ASP.NET执行Excel操作则没有那么困难。但是让这个过程可扩展和可配置则不是一件简单的工作。ASP.NET环境中使用Excel对象时,在长时间的运转时会创建大量的无用线程。事实上,微软也不支持或推荐在服务器端使用Office操作。
在服务器端使用Office操作的问题
设计者在使用Office操作进行Excel报表生成时需要考虑六个主要的问题。设计者应该知道如何处理这些影响并且尽量减少它们所造成的影响。在操作Excel或Office是谨慎的考虑这些问题,因为没有一个方案可以处理所有的问题,而且不同的设计需要从不同的角度来考虑。
a.用户身份:Office程序在运行时会假设一个用户的存在,即使它们是自动执行的。他们会试图去初始化工具栏、目录、可选项和一些附加的基于执行程序的用户的注册表设置。ASP.NET在ASP.NET用户下运行,这个用户只拥有有限的访问权限,因此Office很可能在开始初始化属性时失败,其他的功能也会随之无法使用。所以我们必须通过代码或Web配置文件来完成一个虚拟的过程,而使用代码执行这个虚拟的过程也会出现安全问题。
b.用桌面的交互:Office应用程序假设它们运行在一个可交互的桌面上,并且有时候为了能够工作好需要先是一些自动的功能。如果出现了未预料错误,或者需要一个没有设置的参数来完成功能时,Office被设计成弹出一个对话框询问用户如何去做。而在一个不可交互的桌面上对话框是不能消失的,而这会使得线程被挂起。虽然某些代码可以帮助减少类似状况的发生,但是他们并不能解决所有的问题。
c.可重用和扩展性:服务器端的组件需要有高重用性,多线程的COM组件,同时以最小的支出和最大的访问量为多个终端同时服务。而对于Office应用程序来说,所有的都相反。他们被设计成为单个客户端提供各种各样的但是与资源相关的不可重用基于STA的自动服务器。他们作为一个服务端解决方案提供了很小的扩展性,并且对一些重要的元素进行限制,比如说内存就是不可以在配置里进行修改的。更重要的是,他们使用全局资源(如内存计划文件和共享的自动服务器),如果他们被配置在一个多客户端的环境下,这些资源会限制同时运行的实例个数。希望能够同时运行多个Office应用程序实例的开发人员不得不考虑“程序池”或者顺序访问Office应用程序以避免潜在的死锁和数据错误。
d.恢复能力和稳定性:Office 2000, Office XP和Office 2003使用微软Windows安装(MSI)技术来使用户安装和自修复变得更加容易。MSI介绍了一个第一次使用安装的概念,它允许一些功能动态安装或者在运行时设置(为系统或针对特殊的用户)。在服务器环境下这会降低性能并且还会增加一些出现对话框询问用户确认安装或是提供一个可行的安装盘的可能。虽然它被设计成增加作为终端用户产品的Office的恢复能力,但是Office执行的MSI性能在服务器环境下只会起到反作用。还有,Office在服务器上运行时其稳定性不能保证,因为它没有设计为或测试过这种类型的使用。使用Office在网络服务器上作为一个服务组件可能会降低机器的稳定性。如果我们计划在服务器端自动运行Office,试图独立这些程序到专用的机器上而不影响核心的功能,可以在需要时重启机器。
e.服务器端安全:Office应用程序从来就没有考虑过在服务器端使用,因此也就没有过多地考虑被分发的组件所面临的安全问题。Office不审核进来的请求,而且也不保护无意运行的宏,或者开始另外一个可能通过服务器端代码运行宏的服务器。不要打开从一个匿名网站上传到服务器上的文件!基于上一次配置的安全设置,服务器可以以管理员或系统的所有权限运行宏。另外,Office使用很多客户端组件(如简单的MAPI,MSDAIPP),这些组件可以缓存客户端的认证信息以提升速度。假如Office在服务器端自动运行,一个事例可能可以服务多个客户,由于认证信息已经被缓存给上一个过程,就有可能让另外一个客户使用缓存的另外一个客户的认证信息,然后模拟其他的用户获得未经许可的访问权限。
f.性能成本:在服务器端的ASP.NET代码中使用Excel对象来自动运行Excel相对于可选方案来讲也会降低性能。每一个Excel操作都包含一个COM调用,而这些又包含了运行是调用中间层,在生成相对较大的报表时会很明显的影响到速度。
除了上述这些技术上的考量,设计人员还要考虑这种设计在许可证上的灵活性。现有的许可防止Office应用程序被应用到服务器上来服务客户端请求,除非这些客户端都有Office的许可副本。使用服务器端自动运行来给未被许可的工作站提供Office功能在终端用户许可说明中是不包括的。
替代方案
微软强烈的推荐开发人员在开发服务器端解决方案时应该寻找自动运行的替代方法。由于设计上的局限性,直接修改的配置还不足以解决所有的问题。微软推荐了一些不需要在服务器端安装的替代方案,这些方案相对自动运行可以更有效更快地完成一些普通的任务。
最推荐的方法是生成XML文件或者HTML文件,他们可以用来表现电子表格。因为Office2000以及之后的版本都支持HTML作为本地的文档格式,大部分的文档都能在需要的时候以HTML格式或者使用XML标记创建,然后使用MIME类型发送给客户端,于是客户端的文字都会在Office中显示出来。文档能够被编辑、保存甚至在需要的时候还可以返回到服务器上,而这所有的一切使用ASP.NET就能够完全实现。对于早期的Office版本,可以使用一些其他的易于操作的文本格式。
一些本地的二进制格式文件可以使用Office Web组件或者ActiveX数据对象(ADO)以很快的速度和扩展性来编辑。Office Web组件可以用来生成有限功能的电子表格。但是这些组件的性能成本相对直接使用Office组件要小一些。文档的属性可以在非自动运行的情况下被查看或者更改,而且使用FrontPage服务器扩展或者分发的认证和版本系统来进行文件管理和版本管理是可能的。当基本的功能自动运行后,大部分的任务都被下载到客户端,为系统提供更好的稳定性和扩展性,因为每个用户都是在他们本机使用自己的设置来运行任务。
案例学习
在我们上一个项目中,他们让我们生成Excel报表来与JD Edwards集成。开始我们使用传统的方法来生成Excel报表。这些报表包含大量的公式、备注和格式于是用户可以直接在这些Excel报表上工作。
下面的代码描述了我们用来生成Excel报表的方法:

Excel.Application excelApplication;
Excel._Workbook   excelWorkBook;
Excel._Worksheet  excelWorkSheet;
Excel.Range       excelRange;

// Perform garbage collection to free existing resources.

C.Collect();

// Create the excel object
excelApplication = new Excel.Application();
excelApplication.Visible = false;

// Create a new workbook.
excelWorkBook = (Excel._Workbook)
(excelWorkBook.Workbooks.Add(Type.Missing)); 

// Get the active sheet
excelWorkSheet = (Excel._Worksheet)excelWorkBook.ActiveSheet; 

// Print the details
for
(int index=0; index < noOfRecords; index++)
{
      // Do some processing
excelWorkSheet.Cells[index, 1] = "RecordValue"; 

      // Code to perform more formatting
}                                              

//AutoFit columns A:Z.
excelRange = excelWorkSheet.get_Range("A1", "Z1");
excelRange.EntireColumn.AutoFit(); 

excelApplication.Visible = false;
excelApplication.UserControl = false

excelWorkBook.SaveAs(temporaryFileName,
Excel.XlFileFormat.xlWorkbookNormal, null, null,                  false, false, Excel.XlSaveAsAccessMode.xlShared,

false
, false, null, null, null); 

// Need all following code to clean up and free all references!!!
excelWorkBook.Close(null,null,null);
excelApplication.Workbooks.Close(); 

// Free the resources
excelApplication.Quit(); 

System.Runtime.InteropServices.Marshal.ReleaseComObject(excelRange);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApplicatn)System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkShet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkBook);

// Set the object values to null
excelWorkSheet   = null;
excelWorkBook    = null;
excelApplication = null

// Force Garbage collection
GC.Collect();

在代码中使用的Excel对象是“Microsoft Excel 11 library”,它可以识别大部分的包含RCW调用的格式。在打印大概6000行数据时,在一个700MHz奔腾IV机器上运行大概需要2-3分钟。
报表的性能取决于客户的期望值,所以我们开始考虑其他的可能方案。幸好,在项目提交给客户之前我们找到了这样一个替代方案。
我们是从一个MSDN链接找到这个方案的。我们生成Office XP支持的XML文件来代替使用Excel对象生成Excel报表。Excel文件在Office XP中可以被保存为XML或者HTML格式。我们也曾想过生成HTML文件而非XML文件。虽然HTML是在Web浏览器上显示Excel数据的理想文件格式,为了满足Excel特殊的功能并且让其在Web浏览器上显示得更好,这时候的Excel HTML特别复杂。结果是生成的文件只能被Excel识别。XML可以帮助分离数据和格式,就可以生成一个更干净,更丰富和更重要的文件格式使得Excel数据能够被其他程序使用。
我们不得不决定(或是被迫)试验这种新方法。发生的一切都很顺利,我们发现这种新方法是一种非常稳定而且是以性能为驱动的方法。我们可以在30-40秒的时间内生成包含大量数据的(多于10,000行)报表。
XML方法的功能
在Excel和微软Office XP电子表格组件中的一些XML执行功能包括:
Excel和电子表格组件中的回滚信息
打开非Excel,非电子表格组件生成的XML数据文件
打开并整理特殊的或者整齐的XML文件
打开手写的XML电子表格文档
从Excel发布数据到电子表格组件
从电子表格组件中导出数据到Excel
从Excel复制和粘贴数据到电子表格组件,反之亦然
在Excel中使用基于XML的查询表对象
在Excel和电子表格组件中采用XML来使用范围对象
XML方法的局限性
不支持Excel宏
可能还有更多的局限性,但是对于生成比较复杂并且好看的报表来说,XML方法是中间最好的一个。因为生成XML文件所用的代码有很多都是重复性的,我们建议将执行XML生成的部分写成一个类库使其可以在类似的项目中使用,可以节省您的时间和成本。

4、安全
在架构一个报表系统时安全是最重要的部分。管理报表数据分发的安全是其中的一个重要部分。.NET架构充分的支持动态目录(AD),允许开发人员很容易的在报表系统中通过给报表应用AD权限并且将报表过程对象的权限赋给那些有特殊数据访问权限的组,于是所有的安全问题(包括报表系统)都可以通过管理组员权限来进行管理。
在.NET中创建Excel报表,Office提供的自动运行并不是一个好的方法。如果你仍然比较喜欢使用,建议好好考虑在报表架构中的安全漏洞,并且谨慎的管理匿名帐号和ASPNET帐号的权限。
在大型的面向安全的数据库系统中采用的安全方法是在配置服务器的基础上设立单独的报表服务器。它可以提升性能并保证数据的安全。数据将以视图的方式发布到外界,然后这些视图将采用SQL/Windows的验证机制。

5、结论
选择合适的工具来生成报表取决于应用程序的类型以及成本。架构的选择、准备使用的组件等则取决于你的配置策略以及应用架构。
在决定一个报表策略之前先考虑配置策略。在生成Excel报表时采用Excel自动运行是不明智的选择。而以XML文件的方式生成Excel报表从扩展性和性能角度来讲会更好一些。在.NET下生成PDF报表和水晶报表并不困难,但在分布式的环境中一定要考虑好许可证的问题。报表的安全可以通过动态目录服务和IIS来达到。
6、参考资料
http://www.businessobjects.com/
http://www.datadynamics.com/default.aspx
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnexcl2k2/html/odc_xlsmlinss.asp 
http://www.microsoft.com/sql/reporting/default.asp 
MSDN Articles
7、术语表
 
Active Directory Service(动态目录服务):动态目录是Windows 2000架构中的一个集成部分。动态目录允许组织集中管理和共享网络资源上的信息以及从网络安全角度需要集中审核的用户。
EULA:终端用户许可协议
MIME:多目标互联网邮件扩展
OWC:Office网络组件

作者:Harish PS
Wipro Technologies.

原创粉丝点击