舒清錄,廖明梅
(臨滄師范高等專(zhuān)科學(xué)校信息科學(xué)與技術(shù)系,云南臨滄677000)
舒清錄,廖明梅
(臨滄師范高等專(zhuān)科學(xué)校信息科學(xué)與技術(shù)系,云南臨滄677000)
在MIS系統(tǒng)中,設(shè)計(jì)一個(gè)既要滿(mǎn)足系統(tǒng)功能又要符合用戶(hù)習(xí)慣的報(bào)表,是MIS系統(tǒng)的重點(diǎn)和難點(diǎn)。在.NET環(huán)境下,以在線(xiàn)評(píng)教系統(tǒng)為基礎(chǔ),討論一個(gè)基于結(jié)構(gòu)可變的數(shù)據(jù)源,通過(guò)與COM組件通訊,實(shí)現(xiàn)了系統(tǒng)與Excel組件無(wú)縫連接的動(dòng)態(tài)的中國(guó)式報(bào)表。
動(dòng)態(tài)報(bào)表;中國(guó)式報(bào)表;COM組件;Excel報(bào)表
報(bào)表是用表格、圖表等格式來(lái)動(dòng)態(tài)顯示數(shù)據(jù)的,在MIS系統(tǒng)中占有重要地位,其設(shè)計(jì)制作也是MIS系統(tǒng)開(kāi)發(fā)的重點(diǎn)和難點(diǎn)之一。特別是中國(guó)式報(bào)表,以其數(shù)據(jù)展示的緊湊性,方便用戶(hù)對(duì)數(shù)據(jù)作出快速的比較和掃描,符合中國(guó)人對(duì)數(shù)據(jù)報(bào)表的需求和審美觀,其自動(dòng)生成更需要使用特殊的處理方法。在VisualStudio.NET環(huán)境中提供兩種報(bào)表,一是水晶報(bào)表〔1〕,因其功能強(qiáng)大而受到很多開(kāi)發(fā)者的青睞,但是其并非微軟的,要部署到項(xiàng)目中需要花費(fèi)不菲的注冊(cè)費(fèi),而且水晶報(bào)表設(shè)置較復(fù)雜,不易上手;再者報(bào)表的樣式是在報(bào)表生成器生成設(shè)計(jì)時(shí)就事先確定的,即報(bào)表的字段是固定的,增減某些列,還需修改報(bào)表配置文件和數(shù)據(jù)源文件。二是Report Viewer報(bào)表,它是微軟自己開(kāi)發(fā)的報(bào)表控件,支持呈現(xiàn)表格格式數(shù)據(jù)和圖表,并且還可以導(dǎo)出為Excel和PDF文件〔2〕。但報(bào)表組件不豐富,不支持最終用戶(hù)自定義報(bào)表格式,如果客戶(hù)對(duì)報(bào)表格式需求較為復(fù)雜時(shí),其比較難以適應(yīng)。
在線(xiàn)評(píng)教系統(tǒng)是一個(gè)對(duì)教師一學(xué)期教學(xué)情況的評(píng)價(jià),要求對(duì)各類(lèi)別所有課程和教師的授課情況做出相應(yīng)的評(píng)價(jià)。報(bào)表對(duì)評(píng)價(jià)項(xiàng)目以及各項(xiàng)目下的小項(xiàng)投票的數(shù)目以及百分比情況比較關(guān)注,從此需求來(lái)看,此報(bào)表具有了中國(guó)式報(bào)表特點(diǎn)。
結(jié)合以上分析,本文提出了利用C#語(yǔ)言無(wú)縫連接〔3〕Excel產(chǎn)生復(fù)雜中國(guó)式報(bào)表的思路并對(duì)其在實(shí)際項(xiàng)目中的應(yīng)用作出了詳細(xì)的闡述。主要考慮到Excel它不僅能夠方便地處理表格和進(jìn)行圖形分析,有強(qiáng)大的數(shù)據(jù)的自動(dòng)處理和計(jì)算功能,數(shù)據(jù)能被用戶(hù)二次利用;而且企業(yè)的業(yè)務(wù)人員大多熟悉Excel軟件,這樣業(yè)務(wù)人員無(wú)須再花費(fèi)時(shí)間和精力去學(xué)習(xí)新的報(bào)表工具。
要利用Excel的Active Automate功能,實(shí)現(xiàn)數(shù)據(jù)報(bào)表的輸出,必須要與Excel對(duì)象模型提供的對(duì)象進(jìn)行交互。微軟的Excel對(duì)象模型包括了數(shù)百個(gè)可供用戶(hù)交互的對(duì)象〔4〕,本文主要使用到Application,Workbook,Worksheet,Range四個(gè)類(lèi)以及它們的成員。其中Application對(duì)象處于Excel對(duì)象模型的頂層,表示整個(gè)Excel應(yīng)用程序;Workbook對(duì)象處于Application對(duì)象的下層,表示一個(gè)Excel工作薄文件;Worksheet對(duì)象包含于Workbook對(duì)象,表示一個(gè)Excel工作表;Range對(duì)象包含于Worksheet對(duì)象之中,表示Excel工作表中的一個(gè)或多個(gè)單元格。
Excel組件屬于COM組件,是非受管代碼,與.NET組件的受管代碼類(lèi)型完全不同。但在.NET環(huán)境中,提供了非受管代碼的COM組建向非受管代碼的.NET組件轉(zhuǎn)換的接口,實(shí)現(xiàn).NET與COM組件的無(wú)縫連接。
2.1 數(shù)據(jù)源結(jié)構(gòu)的動(dòng)態(tài)可變性,增強(qiáng)系統(tǒng)的通用性根據(jù)不同的教學(xué)對(duì)象,采用不同的調(diào)查問(wèn)卷模板,及時(shí)、有效地反饋教學(xué)和學(xué)生反應(yīng),是問(wèn)卷系統(tǒng)應(yīng)具有的基本功能。本系統(tǒng)中,用戶(hù)可以根據(jù)自己的調(diào)查對(duì)象定義不同的問(wèn)卷模板,把不同模板的數(shù)據(jù)存入表中。系統(tǒng)通過(guò)存儲(chǔ)過(guò)程、動(dòng)態(tài)構(gòu)造SQL語(yǔ)句(實(shí)現(xiàn)由表1到表3的轉(zhuǎn)換SQL語(yǔ)句字符串)等技術(shù),自動(dòng)把模板轉(zhuǎn)換為有利于投票數(shù)據(jù)存儲(chǔ)的物理表(類(lèi)似表3的結(jié)構(gòu)),最后通過(guò)ADO.NET、VBA等技術(shù)控制Excel在客戶(hù)端自動(dòng)生成復(fù)雜的中國(guó)式統(tǒng)計(jì)報(bào)表(類(lèi)似表2的Excel電子表格)。
在表1中,第1列為問(wèn)卷內(nèi)容,第2列為問(wèn)卷內(nèi)容選項(xiàng),以#號(hào)作為分隔符,其中1、2、3等分別代表各問(wèn)卷選項(xiàng)。瀏覽器端投票時(shí),數(shù)據(jù)主要存入類(lèi)似表3存儲(chǔ)結(jié)構(gòu)中,為生成動(dòng)態(tài)Excel報(bào)表打下基礎(chǔ)。
本系統(tǒng)設(shè)計(jì)的動(dòng)態(tài)報(bào)表主要是實(shí)現(xiàn)由表1到表3,最后形成表2的Excel報(bào)表樣式的轉(zhuǎn)換過(guò)程,具體的算法實(shí)現(xiàn)見(jiàn)第3部分的相關(guān)偽代碼。在整個(gè)過(guò)程中,表1的第1、2列是可變的(可增加、刪除),表2的結(jié)構(gòu)也會(huì)隨表3的變化而自動(dòng)調(diào)整,使系統(tǒng)生成的報(bào)表具有很強(qiáng)的適用性和通用性。
表1 問(wèn)卷模板
表2 Excel報(bào)表
表3 問(wèn)卷存儲(chǔ)表
2.2 充分發(fā)揮Excel的計(jì)算能力,減少主程序計(jì)算任務(wù)以Excel 2003為例,其提供了數(shù)據(jù)庫(kù),統(tǒng)計(jì)等11類(lèi)不同種類(lèi)的函數(shù)〔5〕,用戶(hù)還可以自定義各種公式,通過(guò)這些函數(shù)公式可創(chuàng)建并完成各種復(fù)雜的運(yùn)算,使Excel具有強(qiáng)大的計(jì)算能力。在.NET環(huán)境中,通過(guò)VBA調(diào)用這些函數(shù)公式完成相關(guān)數(shù)據(jù)的計(jì)算,減少主程序計(jì)算任務(wù)。
在本系統(tǒng)中大部分的數(shù)據(jù)都是從數(shù)據(jù)庫(kù)直接查詢(xún)出來(lái)的,但有些數(shù)據(jù)還需要通過(guò)計(jì)算而得,比如問(wèn)卷回收率、各子項(xiàng)投票在回收問(wèn)卷數(shù)中占的比例等數(shù)據(jù)。如果這些數(shù)據(jù)都在主程序中計(jì)算并存儲(chǔ),都將耗費(fèi)系統(tǒng)一定的計(jì)算時(shí)間和存儲(chǔ)空間。
2.3 中國(guó)式報(bào)表,符合用戶(hù)對(duì)報(bào)表的審美需求國(guó)外的報(bào)表樣式規(guī)整,沒(méi)有格線(xiàn),表頭簡(jiǎn)單,沒(méi)有斜線(xiàn)表頭、分層分組,在系統(tǒng)中的運(yùn)用也相對(duì)簡(jiǎn)單,現(xiàn)在很多開(kāi)發(fā)環(huán)境里自帶的就是類(lèi)似此類(lèi)報(bào)表。但從滿(mǎn)足中國(guó)企業(yè)實(shí)際需求來(lái)說(shuō),顯得不夠直觀、美觀,不太符合中國(guó)人的審美需求。
中國(guó)式報(bào)表的最大優(yōu)點(diǎn)就是它的緊湊性。通常在一頁(yè)面的空間里,可以顯示大量的信息,用戶(hù)可快捷地對(duì)數(shù)據(jù)做出查詢(xún)和檢測(cè)。
要利用COM組件,首先將組件引入到.NET環(huán)境中。在項(xiàng)目中打開(kāi)添加引用對(duì)話(huà)框,選擇COM欄,在COM列表中找到“Microsoft Excel 11.0 Object Library”,確定即可〔6〕。這樣.NET就會(huì)自動(dòng)產(chǎn)生相應(yīng)的.NET組件文件,即可在.NET環(huán)境中正常使用。
下面就是程序?qū)崿F(xiàn)的主要偽代碼。
Private void Dowork(){
Excel.Application excel;//定義Excel對(duì)象
Excel._Workbook xBook;//定義Excel工作簿對(duì)象
通過(guò)ADO.NET獲取模板數(shù)據(jù)集dt_struc(t類(lèi)似表1)
通過(guò)ADO.NET獲取評(píng)價(jià)數(shù)據(jù)集dt_mb(類(lèi)似表3)
通過(guò)SaveFileDialog獲取文件存放位置存入FileName
try{
添加新工作簿XBook
獲取當(dāng)前活動(dòng)工作表XSheet
通過(guò)range,mergeCells生成標(biāo)題行,占第1行
通過(guò)range,mergeCells生成統(tǒng)計(jì)信息(統(tǒng)計(jì)部門(mén),統(tǒng)計(jì)人,時(shí)間),占第2行
Fo(ri=0;i<13;i++){//報(bào)表中前固定13列,從第3行開(kāi)始
合并此列的第3、4行單元格
將dt_mb〔i〕.Columns中的數(shù)據(jù)寫(xiě)入合并后的單元格
}
Fo(rj=0;j 根據(jù)表1,取出并分離子項(xiàng)目(以#為分隔符)存入temp2〔〕中 獲取子項(xiàng)目數(shù)目itemNumber 通過(guò)range,mergeCells合并單元格,每個(gè)項(xiàng)目占2列 將dt_struc〔tj〕〔1〕中的數(shù)據(jù)寫(xiě)入合并后的單元格 Fo(rk=0;k 合并此行的2列 把temp2〔k〕中的數(shù)據(jù)寫(xiě)入合并單元格 } } Fo(ri=0;i Fo(rj=0;j<13;j++){ 把dt_mb〔i〕〔j〕的數(shù)據(jù)寫(xiě)入單元格 range.FormulaR1C1="=RC〔-1〕/RC〔-2〕"http://計(jì)算回收率 range.NumberFormatLocal="0.0%";//并將其設(shè)置為百分比 } Fo(rk=13;k 把dt_mb〔i〕〔k〕的數(shù)據(jù)寫(xiě)入單元格 range.FormulaR1C1="=RC〔-1〕/回收問(wèn)卷數(shù)"http://計(jì)算子項(xiàng)占有比例 range.NumberFormatLocal="0.0%";//并將其設(shè)置為百分比 } } 通過(guò)borders.LineStyle添加表格邊框 通過(guò)HorizontalAlignment設(shè)置對(duì)齊方式 選中Cells〔5,1〕單元格,通過(guò)FreezePanes凍結(jié)窗格 通過(guò)PageSetup.PrintTitleRows=”$1:$4”,設(shè)置打印標(biāo)題行 通過(guò)SaveCopyAs把創(chuàng)建的文件保存到FileName中 通過(guò)GetWindowThreadProcessId()API函數(shù)獲取Excel線(xiàn)程的id號(hào)〔7〕 通過(guò)GetProcessById(參數(shù)).Kil(l),結(jié)束當(dāng)前Excel進(jìn)程 } catch{ 拋出“程序調(diào)用Excel遇到問(wèn)題,請(qǐng)檢查或重新安裝MSofficeExcel”異常 } } 以班級(jí)人數(shù)的80%為抽樣樣本,通過(guò)學(xué)生在瀏覽器端投票,最終得到的效如圖1所示。 圖1 報(bào)表效果圖 通過(guò)闡述了Visual Studio.NET提供的不同報(bào)表的優(yōu)缺點(diǎn),以及選擇Excel作為數(shù)據(jù)報(bào)表的理由。本文圍繞Excel對(duì)象模型和.NET環(huán)境,介紹了一種生成數(shù)據(jù)源結(jié)構(gòu)動(dòng)態(tài)可變、符合用戶(hù)對(duì)報(bào)表的審美需求的中國(guó)式報(bào)表。希望能為其它MIS項(xiàng)目開(kāi)發(fā)的動(dòng)態(tài)報(bào)表的實(shí)現(xiàn)思路提供參考。 〔1〕李明明.VS.net中用后臺(tái)線(xiàn)程向Excel中導(dǎo)入數(shù)據(jù)的研究〔J〕.測(cè)控技術(shù),2011(8):83-86. 〔2〕周金橋.ASP.NET夜話(huà)〔M〕.北京:電子工業(yè)出版社,2009. 〔3〕吳曉敏.政府信息資源目錄體系與交換體系建設(shè)再探〔J〕.信息化建設(shè),2005(Z1):40-42. 〔4〕Ken Getz.從.NET開(kāi)發(fā)人員度理解Excel對(duì)象模型〔DB/OL〕.(2004-10-27).http://msdn.microsoft.com/zh-cn/library/aa168292(v= office.11).aspx. 〔5〕陳國(guó)華.基于Excel的報(bào)表引擎的研究與設(shè)計(jì)〔J〕.計(jì)算機(jī)工程與設(shè)計(jì),2004,25(4):526-529. 〔6〕朱波,張峰.ASP.NET平臺(tái)上基于OFFICE操作集的報(bào)表生成方案〔J〕.實(shí)驗(yàn)室研究與探索,2007,26(10):59-62. 〔7〕宋建松.基于ole技術(shù)調(diào)用EXCEL實(shí)現(xiàn)復(fù)雜報(bào)表生成〔J〕.內(nèi)蒙古電大學(xué)刊,2006(10):40-41. (責(zé)任編輯 袁 霞) On Research and Development of Excel Report Based on.NET Platform SHU Qinglu,LIAO Mingmei In the MIS system,the design of a report meeting both system function and user's habits is important and difficult.In this paper,on the basis of online teaching evaluation system and.NET environment,a model of structure-based variable data sources is discussed to realize a dynamic Chinese-style report of seamless connection with Excel component by communicating with the COM component. dynamic report;Chinese-style report;COM component;Excel report TP311 A 1672-2345(2012)04-0018-04 2011-11-02 2011-11-17 舒清錄,講師,主要從事數(shù)據(jù)庫(kù)開(kāi)發(fā)、WEB開(kāi)發(fā)與應(yīng)用研究.4 總結(jié)
(Information Techonology Depart,Lincang Teachers College,Lincang,Yunnan 677000,China)