一、前言:
开发基于b/s结构的教务信息系统时候,解决报表的生成和打印是不得不面对的问题,而且很多这类的系统又往往需要完成一些复杂的报表打印任务,依据笔者以往开发asp.net程序的经验,依靠浏览器自带的页面打印功能一般不能满足实际需要,水晶报表控件使用复杂,稍有设置不当,就会造成web服务器的服务重启,由于excel具有相对广泛的适用性和易用性,所以通过基于excel模板打印,适应性强,控制性好。简要对比几种web打印方案后,本文阐述在asp.net环境中,结合开发教务系统学生平时成绩打印的实际需求,提出了基于excel模板打印及服务器部署的可行性,取得了较为满意的效果。
二、BS模式下几种报表打印方案及可行性分析
根据以往开发b/s结构程序的经验,当需要在客户端用户展现并打印数据时,通常有这几种方式:1.通过浏览器直接打印;2.在asp.net环境中利用水晶报表组件打印;3.通过在javascript代码中调用excel组件打印,但是通过以上几种方式的打印,会带来诸多不便,对于ie浏览器直接打印情况,首先需要设置页边距、纸张方向,但是现在常用的web浏览器有microsoft ie系列、火狐、360、腾讯、搜狗等等,种类繁多……用户在设置打印时找不到设置区,其次,如果打印数据不止一页,转换第二页时,打印列标题会发生移位或变形,最后,用户电脑屏幕分辨率也会造成打印的数据排列失真;利用在asp.net环境中调用水晶报表组件打印,因其设置繁琐,稍有设置不当,便会造成web服务器崩溃,客户端死机;对于第三种情况下的javascript调用excel模板打印,需要浏览器的安全级别设置为最低,这样会使得用户的上网风险徒增。
对比以上几种打印方案,或多或少存在这样那样的不足,通过开发教务管理系统学生平时成绩打印的实际子项目,在.net项目中调用microsoft office.interop.excel组件,建立打印模板,可以很好地按事先设置的套用格式打印,无需设置浏览器安全级别、打印区域,分页时表列标题不变形、移位,无缝适应于各种电脑分辨率,并且服务器部署简单、快速。
三、具体实现过程
(一)按数据规则建立excel模板。
根据打印的报表格式(包括表头、行标题、列标题等),建立excel文件,保存为“.xls”后缀名,在建立的excel文件中,将打印标题设置为“顶端标题行”,并指定标题行表示方法,如图1所示。将文件存放于项目文件夹中,比如“xls_template”。利用server的 mappath方法获得其物理路径,示例代码如下:
template_path = server.mappath(“xls-template”);//模板路径
图1 设置excel模板的打印标题
(二)添加excel引用,加载模板文件
为项目添加microsoft.office.interop.excel名字空间引用,方可实例化excel的application对象类,将application实例化后,将模板文件的workbook对象加入application操作类中,使excel模板文件中的worksheet为可操作的,示例代码如下:
using microsoft.office.interop.excel; //为asp.net程序添加名字空间引用
application app = new application();//为excel.application对象实例化
_workbook
workbook=workbooks.add(template_path+”\\temp.xls”);//加载模板文件
_worksheet worksheet = (_worksheet)sheets.get_item(1);//模板只有一个sheet表
(三)填充数据,生成下载文档
将数据集加入泛型集合,利用foreach循环将数据填充至模板文件的特定位置,将充填数据后的模板文件克至项目“xls_files”文件夹中,模板打印也即不断建立不同数据集的模板文件副本。通过public void getdown(string mypath)方法,返回客户端的url下载链接,示例代码如下:
foreach
(jingjiejiaowu.model.xjmanage.xj_zxjbxx xsmd in mdlist)
{
worksheet.cells[7 + i, 1] = (i + 1).tostring();
worksheet.cells[7 + i, 2] = xsmd.bjjc.tostring();
worksheet.cells[7 + i, 3] = xsmd.xh.tostring();
…}
//利用foreach循环mdlist泛型数据集中的实体xj_zxjbxx,将数据填充至模板
(四)根据时间差,清理服务器过时文件
由客户端从不同时间段发起get请求,这样一来,项目文件夹“xls_files”将会不断积累 excel模板文件的副本,客户端用户需要下载的文件又是实时的,这样必然造成硬盘空间的浪费,所以根据规定的时间差清理过时文件很有必要,实现的原理是首先循环“xls_files”中的文件,根据文件最后创建的时间对比现在的时间,时间差超过30分钟的将会被删除,示例代码如下:
foreach (system.io.fileinfo f in path.getfiles())
{if (f.exists)
{timespan ts1 = new timespan(datetime.now.ticks);//获取现在时间值
timespan ts2 = new timespan(f.lastwritetime.ticks);//获取创建文件的时间
timespan ts = ts1.subtract(ts2).duration();//求时间差的绝对值
string p = (ts.hours*60+ts.minutes).tostring();//转换分钟
if (convert.toint32(p) > 30)
f.delete();}}}//执行删除方法
四、部署web服务器
(一)配置iis文件访问权限。在web程序中,对于“xls_files”文件夹的读写权限设置尤为重要,因为在客户端请求打印时,系统会将克隆的模板文件拷贝至该文件夹中,即需要申请硬盘访问权限,设置“xls_files”的访问权限。
(二)microsoft excel application属性设置。考虑到客户端用户用可能用到低版本的office,所以需要在服务器上安装excel 2007,在组件服务中,找到dcom配置,设置microsoft excel application属性,将“选择运行此程序的用户账户“附加于具有administrators power usersusers权限组的用户。
除设置运行的目标账户外,还需要为microsoft excel application 的“安全“选项卡,配置“启动和激活权限”,点击“自定义”,为“network service”用户,设置为允许“本地启动”和“本地激活”。
五、结束语
本文通过开发教务管理系统中学生平时成绩打印子模块,结合实际项目需要,比对其他几种打印方案,asp.net环境中基于excel模板的数据导出及打印不失为一种较先进的web报表打印解决方案,通过实际使用,部署web服务器操作的便捷,验证了其高效、有效和可靠性,但如果能加入UI特性,使用户在下载excel时有一个等待进度提示,将会获得较好的用户体验,从而也说明基于excel模板数据导出及打印的技术实现还有很大的优化空间,值得进一步去研究。
核心关注:拓步ERP系统平台是覆盖了众多的业务领域、行业应用,蕴涵了丰富的ERP管理思想,集成了ERP软件业务管理理念,功能涉及供应链、成本、制造、CRM、HR等众多业务领域的管理,全面涵盖了企业关注ERP管理系统的核心领域,是众多中小企业信息化建设首选的ERP管理软件信赖品牌。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/
本文标题:基于Excel模板打印的实现及服务器部署