一、前言:
開(kāi)發(fā)基于b/s結(jié)構(gòu)的教務(wù)信息系統(tǒng)時(shí)候,解決報(bào)表的生成和打印是不得不面對(duì)的問(wèn)題,而且很多這類的系統(tǒng)又往往需要完成一些復(fù)雜的報(bào)表打印任務(wù),依據(jù)筆者以往開(kāi)發(fā)asp.net程序的經(jīng)驗(yàn),依靠瀏覽器自帶的頁(yè)面打印功能一般不能滿足實(shí)際需要,水晶報(bào)表控件使用復(fù)雜,稍有設(shè)置不當(dāng),就會(huì)造成web服務(wù)器的服務(wù)重啟,由于excel具有相對(duì)廣泛的適用性和易用性,所以通過(guò)基于excel模板打印,適應(yīng)性強(qiáng),控制性好。簡(jiǎn)要對(duì)比幾種web打印方案后,本文闡述在asp.net環(huán)境中,結(jié)合開(kāi)發(fā)教務(wù)系統(tǒng)學(xué)生平時(shí)成績(jī)打印的實(shí)際需求,提出了基于excel模板打印及服務(wù)器部署的可行性,取得了較為滿意的效果。
二、BS模式下幾種報(bào)表打印方案及可行性分析
根據(jù)以往開(kāi)發(fā)b/s結(jié)構(gòu)程序的經(jīng)驗(yàn),當(dāng)需要在客戶端用戶展現(xiàn)并打印數(shù)據(jù)時(shí),通常有這幾種方式:1.通過(guò)瀏覽器直接打;2.在asp.net環(huán)境中利用水晶報(bào)表組件打印;3.通過(guò)在javascript代碼中調(diào)用excel組件打印,但是通過(guò)以上幾種方式的打印,會(huì)帶來(lái)諸多不便,對(duì)于ie瀏覽器直接打印情況,首先需要設(shè)置頁(yè)邊距、紙張方向,但是現(xiàn)在常用的web瀏覽器有microsoft ie系列、火狐、360、騰訊、搜狗等等,種類繁多……用戶在設(shè)置打印時(shí)找不到設(shè)置區(qū),其次,如果打印數(shù)據(jù)不止一頁(yè),轉(zhuǎn)換第二頁(yè)時(shí),打印列標(biāo)題會(huì)發(fā)生移位或變形,最后,用戶電腦屏幕分辨率也會(huì)造成打印的數(shù)據(jù)排列失真;利用在asp.net環(huán)境中調(diào)用水晶報(bào)表組件打印,因其設(shè)置繁瑣,稍有設(shè)置不當(dāng),便會(huì)造成web服務(wù)器崩潰,客戶端死機(jī);對(duì)于第三種情況下的javascript調(diào)用excel模板打印,需要瀏覽器的安全級(jí)別設(shè)置為最低,這樣會(huì)使得用戶的上網(wǎng)風(fēng)險(xiǎn)徒增。
對(duì)比以上幾種打印方案,或多或少存在這樣那樣的不足,通過(guò)開(kāi)發(fā)教務(wù)管理系統(tǒng)學(xué)生平時(shí)成績(jī)打印的實(shí)際子項(xiàng)目,在.net項(xiàng)目中調(diào)用microsoft office.interop.excel組件,建立打印模板,可以很好地按事先設(shè)置的套用格式打印,無(wú)需設(shè)置瀏覽器安全級(jí)別、打印區(qū)域,分頁(yè)時(shí)表列標(biāo)題不變形、移位,無(wú)縫適應(yīng)于各種電腦分辨率,并且服務(wù)器部署簡(jiǎn)單、快速。
三、具體實(shí)現(xiàn)過(guò)程
(一)按數(shù)據(jù)規(guī)則建立excel模板。
根據(jù)打印的報(bào)表格式(包括表頭、行標(biāo)題、列標(biāo)題等),建立excel文件,保存為“.xls”后綴名,在建立的excel文件中,將打印標(biāo)題設(shè)置為“頂端標(biāo)題行”,并指定標(biāo)題行表示方法,如圖1所示。將文件存放于項(xiàng)目文件夾中,比如“xls_template”。利用server的 mappath方法獲得其物理路徑,示例代碼如下:
template_path = server.mappath(“xls-template”);//模板路徑
圖1 設(shè)置excel模板的打印標(biāo)題
(二)添加excel引用,加載模板文件
為項(xiàng)目添加microsoft.office.interop.excel名字空間引用,方可實(shí)例化excel的application對(duì)象類,將application實(shí)例化后,將模板文件的workbook對(duì)象加入application操作類中,使excel模板文件中的worksheet為可操作的,示例代碼如下:
using microsoft.office.interop.excel; //為asp.net程序添加名字空間引用
application app = new application();//為excel.application對(duì)象實(shí)例化
_workbook
workbook=workbooks.add(template_path+”\\temp.xls”);//加載模板文件
_worksheet worksheet = (_worksheet)sheets.get_item(1);//模板只有一個(gè)sheet表
(三)填充數(shù)據(jù),生成下載文檔
將數(shù)據(jù)集加入泛型集合,利用foreach循環(huán)將數(shù)據(jù)填充至模板文件的特定位置,將充填數(shù)據(jù)后的模板文件克至項(xiàng)目“xls_files”文件夾中,模板打印也即不斷建立不同數(shù)據(jù)集的模板文件副本。通過(guò)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循環(huán)mdlist泛型數(shù)據(jù)集中的實(shí)體xj_zxjbxx,將數(shù)據(jù)填充至模板
(四)根據(jù)時(shí)間差,清理服務(wù)器過(guò)時(shí)文件
由客戶端從不同時(shí)間段發(fā)起get請(qǐng)求,這樣一來(lái),項(xiàng)目文件夾“xls_files”將會(huì)不斷積累 excel模板文件的副本,客戶端用戶需要下載的文件又是實(shí)時(shí)的,這樣必然造成硬盤(pán)空間的浪費(fèi),所以根據(jù)規(guī)定的時(shí)間差清理過(guò)時(shí)文件很有必要,實(shí)現(xiàn)的原理是首先循環(huán)“xls_files”中的文件,根據(jù)文件最后創(chuàng)建的時(shí)間對(duì)比現(xiàn)在的時(shí)間,時(shí)間差超過(guò)30分鐘的將會(huì)被刪除,示例代碼如下:
foreach (system.io.fileinfo f in path.getfiles())
{if (f.exists)
{timespan ts1 = new timespan(datetime.now.ticks);//獲取現(xiàn)在時(shí)間值
timespan ts2 = new timespan(f.lastwritetime.ticks);//獲取創(chuàng)建文件的時(shí)間
timespan ts = ts1.subtract(ts2).duration();//求時(shí)間差的絕對(duì)值
string p = (ts.hours*60+ts.minutes).tostring();//轉(zhuǎn)換分鐘
if (convert.toint32(p) > 30)
f.delete();}}}//執(zhí)行刪除方法
四、部署web服務(wù)器
(一)配置iis文件訪問(wèn)權(quán)限。在web程序中,對(duì)于“xls_files”文件夾的讀寫(xiě)權(quán)限設(shè)置尤為重要,因?yàn)樵诳蛻舳苏?qǐng)求打印時(shí),系統(tǒng)會(huì)將克隆的模板文件拷貝至該文件夾中,即需要申請(qǐng)硬盤(pán)訪問(wèn)權(quán)限,設(shè)置“xls_files”的訪問(wèn)權(quán)限。
(二)microsoft excel application屬性設(shè)置?紤]到客戶端用戶用可能用到低版本的office,所以需要在服務(wù)器上安裝excel 2007,在組件服務(wù)中,找到dcom配置,設(shè)置microsoft excel application屬性,將“選擇運(yùn)行此程序的用戶賬戶“附加于具有administrators power usersusers權(quán)限組的用戶。
除設(shè)置運(yùn)行的目標(biāo)賬戶外,還需要為microsoft excel application 的“安全“選項(xiàng)卡,配置“啟動(dòng)和激活權(quán)限”,點(diǎn)擊“自定義”,為“network service”用戶,設(shè)置為允許“本地啟動(dòng)”和“本地激活”。
五、結(jié)束語(yǔ)
本文通過(guò)開(kāi)發(fā)教務(wù)管理系統(tǒng)中學(xué)生平時(shí)成績(jī)打印子模塊,結(jié)合實(shí)際項(xiàng)目需要,比對(duì)其他幾種打印方案,asp.net環(huán)境中基于excel模板的數(shù)據(jù)導(dǎo)出及打印不失為一種較先進(jìn)的web報(bào)表打印解決方案,通過(guò)實(shí)際使用,部署web服務(wù)器操作的便捷,驗(yàn)證了其高效、有效和可靠性,但如果能加入U(xiǎn)I特性,使用戶在下載excel時(shí)有一個(gè)等待進(jìn)度提示,將會(huì)獲得較好的用戶體驗(yàn),從而也說(shuō)明基于excel模板數(shù)據(jù)導(dǎo)出及打印的技術(shù)實(shí)現(xiàn)還有很大的優(yōu)化空間,值得進(jìn)一步去研究。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://www.ezxoed.cn/
本文標(biāo)題:基于Excel模板打印的實(shí)現(xiàn)及服務(wù)器部署
本文網(wǎng)址:http://www.ezxoed.cn/html/support/1112158852.html