基于Excel模板打印的实现及服务器部署

时间:2022-10-10 05:20:13

基于Excel模板打印的实现及服务器部署

摘要:简要介绍了几种在环境中调用Excel打印报表的方法,针对实际需求,对比几种方法的优缺点,提出了在Web开发中基于Excel模板打印及服务器部署的可行性方案,并给出了相关的实现代码和说明。

关键词:;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 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.省略;Excel template;Server deployment

一、前言:

开发基于B/S结构的教务信息系统时候,解决报表的生成和打印是不得不面对的问题,而且很多这类的系统又往往需要完成一些复杂的报表打印任务,依据笔者以往开发Asp.省略环境中,结合开发教务系统学生平时成绩打印的实际需求,提出了基于Excel模板打印及服务器部署的可行性,取得了较为满意的效果。

二、BS模式下几种报表打印方案及可行性分析

根据以往开发B/S结构程序的经验,当需要在客户端用户展现并打印数据时,通常有这几种方式:1.通过浏览器直接打印;2.省略环境中利用水晶报表组件打印;3.省略环境中调用水晶报表组件打印,因其设置繁琐,稍有设置不当,便会造成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.省略程序添加名字空间引用

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.省略环境中基于Excel模板的数据导出及打印不失为一种较先进的Web报表打印解决方案,通过实际使用,部署Web服务器操作的便捷,验证了其高效、有效和可靠性,但如果能加入UI特性,使用户在下载Excel时有一个等待进度提示,将会获得较好的用户体验,从而也说明基于Excel模板数据导出及打印的技术实现还有很大的优化空间,值得进一步去研究。

参考文献:

[1]王兴,李菊,陈玮中Excel文档生成技术研究.软件导刊,2010

[2]李永锋,谷川.一种模板化的Web 打印方法的设计与实现.计算机应用与软件,2010(4)

上一篇:从行动到故事 下一篇:P2P网络技术应用中常见问题的分析和解决