巫喬順,彭海波,李 杰
(武鋼集團(tuán)昆明鋼鐵股份有限公司信息中心,云南昆明 650302)
報(bào)表主要用來展現(xiàn)一些綜合數(shù)據(jù),計(jì)算機(jī)廣泛應(yīng)用之前多以人工填報(bào)方式完成,不僅工作效率低下,勞動(dòng)強(qiáng)度大,而且出錯(cuò)率較高。隨著計(jì)算機(jī)技術(shù)的發(fā)展,在目前的實(shí)際應(yīng)用中,有的企業(yè)購買專門的報(bào)表軟件來完成報(bào)表填報(bào),有的企業(yè)則在計(jì)算機(jī)程序語言中采用硬編碼繪制。這些方法在實(shí)施成本、維護(hù)成本及靈活性等方面都存在這樣或那樣的不足,尤其當(dāng)用戶報(bào)表需求變化時(shí),往往要等待開發(fā)人員來修改報(bào)表,甚至要重新開發(fā)新程序后才能實(shí)現(xiàn),往往滿足不了報(bào)表需求經(jīng)常變化的實(shí)時(shí)性要求,即使勉強(qiáng)滿足,也會讓開發(fā)維護(hù)人員疲于奔命,增加實(shí)施和后期維護(hù)成本。而對于已出現(xiàn)的部分應(yīng)用Excel做介質(zhì)的報(bào)表處理技術(shù),除了在靈活性及可配置性方面有欠缺外,只能在Windows系統(tǒng)上實(shí)現(xiàn),在Linux或者Unix等系統(tǒng)上就無能為力了。
有鑒于此,為克服現(xiàn)有技術(shù)的不足,本文設(shè)計(jì)了一種以低成本、易用性、可配置、自定義為目的的動(dòng)態(tài)報(bào)表系統(tǒng),以滿足用戶多變的需求。
首先,利用XML具有的自定義性、可擴(kuò)展性等優(yōu)勢[1],選定其來定義各種類型報(bào)表的數(shù)據(jù)乃至報(bào)表格式,作為報(bào)表數(shù)據(jù)和格式的定義語言;其次,選定目前市場上用途最廣、使用人數(shù)最多的電子表格系統(tǒng)Excel來定義報(bào)表模板,借助其強(qiáng)大的展現(xiàn)和數(shù)據(jù)處理功能,方便用戶根據(jù)需求自己編輯、定義所需報(bào)表以方便處理復(fù)雜的中國式報(bào)表,實(shí)現(xiàn)所見即所得功能[2]。
本文設(shè)計(jì)的是一種自定義動(dòng)態(tài)報(bào)表系統(tǒng),由數(shù)據(jù)層、定義層、業(yè)務(wù)層和展現(xiàn)層構(gòu)成,如圖1所示。
圖1 報(bào)表系統(tǒng)結(jié)構(gòu)圖
數(shù)據(jù)層為任何能提供報(bào)表原始數(shù)據(jù)的數(shù)據(jù)源,如數(shù)據(jù)庫、文本文件等,可以是異構(gòu)的。
定義層是基于XML的配置文件,由報(bào)表宏觀定義、報(bào)表頭定義、報(bào)表體定義、報(bào)表尾定義共4部分組成。報(bào)表宏觀定義主要用來定義報(bào)表的類型、最終處理方式、打印機(jī)名、打印份數(shù)、數(shù)據(jù)源獲取方式等;報(bào)表頭定義、報(bào)表體定義、報(bào)表尾定義用來定義報(bào)表數(shù)據(jù)具體對應(yīng)的數(shù)據(jù)層數(shù)據(jù)和顯示位置、計(jì)算公式。
展現(xiàn)層是基于Excel的模板文件,在模板中定義共性的報(bào)表元素或者特征,或者由程序根據(jù)配置文件生成報(bào)表,如報(bào)表的風(fēng)格、描述性文字及其內(nèi)容、字體、顏色、計(jì)算公式等信息。
業(yè)務(wù)層具有解析配置文件、加載報(bào)表模板、處理報(bào)表數(shù)據(jù)、生成最終報(bào)表的功能。
本文設(shè)計(jì)的報(bào)表系統(tǒng)根據(jù)報(bào)表頭、報(bào)表體、報(bào)表尾的特征按下列類型進(jìn)行劃分。
Ⅰ類報(bào)表:表中的行、列數(shù)據(jù)格式均固定不變,報(bào)表數(shù)據(jù)以填充單元格形式提供。
Ⅱ類報(bào)表:報(bào)表頭和報(bào)表尾格式固定,報(bào)表體的列格式及其中的數(shù)值類型、數(shù)量、描述固定,而行格式及其中的數(shù)據(jù)為動(dòng)態(tài)可變,如圖2所示。
圖2 報(bào)表分類示意圖
Ⅲ類報(bào)表:報(bào)表頭和報(bào)表尾格式固定,表中的行、列格式及其中的數(shù)值類型、數(shù)量、描述為動(dòng)態(tài)可變。
下面以自定義帶條形碼打印的某鋼材標(biāo)牌報(bào)表的實(shí)現(xiàn)作為示例,介紹報(bào)表在本系統(tǒng)中的實(shí)現(xiàn),標(biāo)牌報(bào)表如圖3所示,實(shí)現(xiàn)流程如圖4所示。
圖3 Excel模板文件示例圖
101,根據(jù)報(bào)表需求定義報(bào)表類型。如圖3所示,該標(biāo)牌報(bào)表是一種鋼材產(chǎn)品標(biāo)牌,報(bào)表顯示的行、列格式固定,需要打印二維條碼,數(shù)據(jù)來源于數(shù)據(jù)庫,但標(biāo)簽打印紙的高度、長度、報(bào)表元素等格式為動(dòng)態(tài)可變,需要根據(jù)生產(chǎn)情況和標(biāo)簽紙消耗實(shí)際情況決定,因此根據(jù)報(bào)表需求將帶條形碼打印的標(biāo)牌報(bào)表定義為Ⅰ類報(bào)表。
圖4 自定義動(dòng)態(tài)報(bào)表生成流程圖
102,根據(jù)步驟101的Ⅰ類報(bào)表類型定義XML配置文件。
第一步,在計(jì)算機(jī)硬盤指定路徑下新建以該報(bào)表名字命名的文件夾“熱軋鋼帶大牌”。
第二步,在“熱軋鋼帶大牌”文件夾下新建一個(gè)Excel文件,命名為“熱軋鋼帶大牌.xls”。內(nèi)容包含品名、標(biāo)準(zhǔn)、級別、重量、規(guī)格、鋼種、檢驗(yàn)員、日期班別、二維條碼控件等。建立后的模板文件如圖3所示,其中的文字描述最好與生產(chǎn)實(shí)際的相似,能讓人一目了然,而二維條碼控件則是Excel自帶的ActiveX控件,值指向單元格A7。
圖5 XML配置文件示例圖
第三步,在“熱軋鋼帶大牌”文件夾下新建一個(gè)XML文件,命名為“Declare.xml”。建立后的配置文件如圖5所示,包含報(bào)表宏觀定義、報(bào)表頭定義、報(bào)表體定義、報(bào)表尾定義4個(gè)定義部分,其中報(bào)表宏觀定義中定義了報(bào)表的類型為Ⅰ,報(bào)表的處理方式為直接打印,打印機(jī)名為K28,打印數(shù)量為2。由于默認(rèn)的數(shù)據(jù)來源于數(shù)據(jù)庫,所以本示例省略了數(shù)據(jù)源方面的定義。由于此報(bào)表可以看作Ⅱ類型的特殊形式,即只有報(bào)表頭的報(bào)表,因而也只對報(bào)表頭進(jìn)行了定義,如圖5所示?!癋S PRINTMATERIAL”這一數(shù)據(jù)字段對應(yīng)圖3所示的“熱軋鋼帶大牌”所在單元格,即行索引為2,列索引為B,其他字段定義依此類推。
103,通過業(yè)務(wù)層解析 XML配置文件,得到“Declare.xml”配置文件信息,同時(shí)“熱軋鋼帶大牌.xls”模板文件加載至計(jì)算機(jī)內(nèi)存中,以形成普通報(bào)表。
104,根據(jù)步驟103得到的配置文件信息,從數(shù)據(jù)層獲取原始數(shù)據(jù)并加工成報(bào)表數(shù)據(jù)。本步驟中,系統(tǒng)根據(jù)“Declare.xml”配置文件首先從數(shù)據(jù)庫中找到FS_PRINTMATERIAL、FS_STANDARD等原始數(shù)據(jù)并進(jìn)行處理,如是否求和、求平均值、小數(shù)位數(shù)處理等,本示例中的IsSum=“0”表示不需要進(jìn)行求和計(jì)算。實(shí)際操作中,大多數(shù)公式可以在Excel模板中直接進(jìn)行定義,并不需要報(bào)表系統(tǒng)解析公式后再單獨(dú)處理,“Declare.xml”配置文件中的公式定義功能是在情況比較復(fù)雜、Excel模板很難定義的情況下才使用。
105,將步驟104加工的報(bào)表數(shù)據(jù)與步驟103加載的展現(xiàn)層即Excel模板文件結(jié)合后,在系統(tǒng)內(nèi)存中生成報(bào)表。本步驟中,報(bào)表系統(tǒng)會將步驟104中處理好的報(bào)表數(shù)據(jù)依據(jù)配置文件定義信息填充到Excel模板對應(yīng)位置,如“品名”對應(yīng)的數(shù)據(jù)源FS_PRINTMATERIAL輸出到第二行的B列,生成后的報(bào)表駐留在內(nèi)存當(dāng)中。
106,根據(jù)步驟103得到的配置文件信息對步驟105生成的報(bào)表進(jìn)行處置后,打開或下載保存或直接打印出報(bào)表。本步驟中,報(bào)表系統(tǒng)會根據(jù)“Declare.xml”配置文件的配置信息處置駐留在內(nèi)存中的報(bào)表,處置完成后將Excel報(bào)表模板、XML定義文件、報(bào)表對象注銷,釋放內(nèi)存資源,在本示例中,將調(diào)用名為“K28”的打印機(jī)進(jìn)行打印,打印數(shù)量為2。
本系統(tǒng)能夠滿足多變的報(bào)表需求,既可應(yīng)用于C/S系統(tǒng),也可應(yīng)用于B/S系統(tǒng)。報(bào)表制作簡單,使用靈活,數(shù)據(jù)層、業(yè)務(wù)層、定義層及展現(xiàn)層的相互分離,使得用戶只要會使用Excel就可自己調(diào)整和定義,實(shí)現(xiàn)所見即所得。同時(shí)能使報(bào)表系統(tǒng)的實(shí)施和維護(hù)成本大幅降低,通過簡單的配置即可自定義動(dòng)態(tài)生成報(bào)表,服務(wù)端的部署可以在Linux或者Unix等系統(tǒng)上完成,具有極高的靈活性、易用性和實(shí)用性。
[1] 凌宇.基于XML的動(dòng)態(tài)報(bào)表實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2004(增刊1):607-609.
[2] 文靜華,張梅,田建強(qiáng).基于Excel的企業(yè)通用動(dòng)態(tài)報(bào)表生成工具的設(shè)計(jì)[J].計(jì)算機(jī)工程,2005(4):221-223.