论文部分内容阅读
摘要:简要介绍了几种在ASP.NET环境中调用Excel打印报表的方法,针对实际需求,对比几种方法的优缺点,提出了在Web开发中基于Excel模板打印及服务器部署的可行性方案,并给出了相关的实现代码和说明。
关键词:Asp.net;Excel模板;服务器部署
中图分类号:TP391.13 文献标识码:A文章编号:1007-9599(2012)03-0000-02
The Server Deployment and Realization of the Printing Based on the Excel Templates
Liu Donghua,Cheng Yajuan
(Nanchang Business School,Jiangxi Agricultural University,Nanchang330044,China)
Abstract:In view of the actual demand,several methods in the ASP.NET environment about printing Excel report are introduced in this paper.The advantages and disadvantages of the several methods is compared and the deployment scheme based on the Excel template printing and server is put forward in the development of the Web,added the description and relevant code.
Keywords:Asp.net;Excel template;Server deployment
一、前言:
开发基于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,将数据填充至模板
workbook.SaveCopyAs(Xls_Files);//利用workbook对象克隆模板至Xls_Files
public void GetDown(string MyPath)
{
…
System.IO.FileInfo file = new System.IO.FileInfo(MyPath);
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF8;
…
Response.AddHeader("Content-Length", file.Length.ToString());
// 指定返回一个不能被客户端读取的流下载
Response.ContentType = "application/ms-excel";
//把文件流下载到客户端
Response.WriteFile(MyPath);
Response.End();// 停止页面执行
}
(四)根据时间差,清理服务器过时文件
由客户端从不同时间段发起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模板数据导出及打印的技术实现还有很大的优化空间,值得进一步去研究。
参考文献:
[1]王兴,李菊,陈玮.ASP.NET中Excel文档生成技术研究.软件导刊,2010
[2]李永锋,谷川.一种模板化的Web 打印方法的设计与实现.计算机应用与软件,2010(4)
关键词:Asp.net;Excel模板;服务器部署
中图分类号:TP391.13 文献标识码:A文章编号:1007-9599(2012)03-0000-02
The Server Deployment and Realization of the Printing Based on the Excel Templates
Liu Donghua,Cheng Yajuan
(Nanchang Business School,Jiangxi Agricultural University,Nanchang330044,China)
Abstract:In view of the actual demand,several methods in the ASP.NET environment about printing Excel report are introduced in this paper.The advantages and disadvantages of the several methods is compared and the deployment scheme based on the Excel template printing and server is put forward in the development of the Web,added the description and relevant code.
Keywords:Asp.net;Excel template;Server deployment
一、前言:
开发基于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,将数据填充至模板
workbook.SaveCopyAs(Xls_Files);//利用workbook对象克隆模板至Xls_Files
public void GetDown(string MyPath)
{
…
System.IO.FileInfo file = new System.IO.FileInfo(MyPath);
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF8;
…
Response.AddHeader("Content-Length", file.Length.ToString());
// 指定返回一个不能被客户端读取的流下载
Response.ContentType = "application/ms-excel";
//把文件流下载到客户端
Response.WriteFile(MyPath);
Response.End();// 停止页面执行
}
(四)根据时间差,清理服务器过时文件
由客户端从不同时间段发起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模板数据导出及打印的技术实现还有很大的优化空间,值得进一步去研究。
参考文献:
[1]王兴,李菊,陈玮.ASP.NET中Excel文档生成技术研究.软件导刊,2010
[2]李永锋,谷川.一种模板化的Web 打印方法的设计与实现.计算机应用与软件,2010(4)