一、前言:
開發基于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.lukmueng.com/
本文標題:基于Excel模板打印的實現及服務器部署