孫晶
新疆石油勘察設計研究院信息中心 834000
不良模糊化實現(xiàn)在企業(yè)管理軟件中的應用
孫晶
新疆石油勘察設計研究院信息中心 834000
在企業(yè)辦公系統(tǒng)中,常常有用戶需要將報表直接用Excel打開或者是習慣于通過Excel對報表進行打印。Apache的POI項目,目標是處理OLE2對象,目前比較成熟的是HSSF接口,處理MS Excel(97-2003)對象,以及新開發(fā)的XSSF接口,處理MS Excel(2007)對象。它不像我們僅僅是用CSV生成的沒有格式的,僅由Excel轉(zhuǎn)換而來的東西,而是真正的Excel對象,你可以控制一些屬性如shell、cell等等。
第2代對象鏈接和嵌入技術(shù) ;文件輸入流;數(shù)據(jù)轉(zhuǎn)移
OLE2(Object Linking and Embed;dfiinleg )I nput Stream ; data transfer
1.1 POI實現(xiàn)背景及其目的
市場上Microsoft Excel得到了廣泛接受以用于簡單的數(shù)據(jù)存儲和操作。其允許非技術(shù)上的熟練用戶在易于使用且功能強大的基于GUI的應用程序中輸入以及操作數(shù)據(jù)。然而,偶爾也必須將Excel電子表格中所駐留的數(shù)據(jù)適配于其他用途,將其進行廣泛分布、頻繁更新,或由一個大型用戶群來訪問。而這些功能都是Excel設計中所沒有提供的。另一方面,最好是能夠利用Microsoft Excel中已開發(fā)的商務用戶的知識和技能以及關系數(shù)據(jù)庫存儲模型固有的功能和分布式特性。通過利用Apache的POI和HSSF等來促進Excel與Oracle數(shù)據(jù)庫之間的集成,我們將逐漸實現(xiàn)這些目標。
1.2 POI構(gòu)成簡述及其優(yōu)點
P O I代表P o o r O b f u s c a t i o n Implementation,即不良模糊化實現(xiàn),它的目標就是提供一組Java API來使得基于Microsoft OLE2Compound Document格式的Microsoft Office文件易于操作。一些POI API僅僅是為最常用的Microsoft Office文件Word和Excel而開發(fā)的;而其他的API則是用于通用的OLE 2Compound Document和屬性文件。
POI子項目包括:POIFS、HSSF、HDF、HPSF
(1)滿足需求:可創(chuàng)建使用HSSF的工具來自動化同步以及Excel緊密集成。
(2)維護:易受數(shù)據(jù)庫模式更改的影響,但獨立于Excel的功能。
(3)成本:取決于所需功能,在編程工作上可能需要投入大量的時間和金錢。
(4)利用:利用整個Java API和POI后續(xù)開發(fā)包
(5)自動化:Java API支持自動化。
1.3 POI處理過程概述
首先需要下載POI的包,可以到apache的官網(wǎng)上下載,目前最新發(fā)布的資源包是poi-3.7-beta3.jar、poi-ooxml-3.7-beta3. jar。POI對Excel的操作可概括為導入與導出,即讀數(shù)據(jù)與寫數(shù)據(jù)。
1.3.1 導入一個Excel文件
導入Excel時,可通過Java API中的正則表達式識別要導入的文件擴展名是“xls”還是“xlsx”,前者需要調(diào)用POI中的HSSF接口來讀取文件,如果是后者則是用POI中的XSSF接口讀取文件。
圖1 讀取Excel文件的流程
FileInputStream屬于Java API的數(shù)據(jù)輸入流對象。在通過HSSF或XSSF接口獲取到工作簿W(wǎng)orkbook對象,再通過工作簿W(wǎng)orkbook獲取第一個報表Sheet對象,再通過Sheet李的方法getPhysicalNumberOfRows ()得到報表總行數(shù)t o t a l R o w s和方法getPhysicalNumberOfCells()得到報表總列數(shù)。經(jīng)過循環(huán)迭代后得到每個單元格Cell對象,進而得到單元格中的數(shù)據(jù)。
1.3.2 導出一個Excel文件
我們以創(chuàng)建一個2003版即擴展名是xls的excel文件為例,程序代碼如下:
FileOutputStream屬于Java API的數(shù)據(jù)輸出流對象。通過它來將一個名為test.xls文件創(chuàng)建在C盤根目錄下,運行該輸出程序后可以看到C盤上的根目錄上多了一個Excel文件。如果將程序中的FileOutputStream(“C: \test.xls”)的參數(shù)改為“test.xls”,則文件就會創(chuàng)建在該項目的根目錄下。在往Excel單元格里寫入信息時,依然遵從自定向下的關系,即:工作簿→(HSSFWorkbook)→表格(HSSFSheet)→表格行(HSSFRow)→單元格(HSSFCell)。將數(shù)據(jù)庫中表的數(shù)據(jù)導入到Excel中,首先我們要先將數(shù)據(jù)庫中的表的數(shù)據(jù)查詢出來,這里通過Hibernate將數(shù)據(jù)庫某個表中的數(shù)據(jù)查詢出來,然后通過循環(huán)將表中的數(shù)據(jù)寫入Excel中去。我們可以一個目前我院正在使用的管理系統(tǒng)為例。
2.1 人員基礎信息管理系統(tǒng)介紹
隨著電腦的普及與使用,現(xiàn)在的管理也提升了一個檔次,漸漸實現(xiàn)了無紙化辦公,即從原來的人工記錄管理模式轉(zhuǎn)變?yōu)殡娔X一體化管理。人力資源是社會生產(chǎn)的必要先決條件,充足的人力資源有利于生產(chǎn)的發(fā)展。我院近年來陸續(xù)招聘了大批青年人才,使得設計力量逐漸發(fā)展壯大,隨著人數(shù)的增加,數(shù)據(jù)量的擴增,流動數(shù)據(jù)不能及時處理,信息查詢效率低,信息不能及時反饋更新。為了加強對人才的管理,提高相關部門的業(yè)務管理和事務處理效率,建立完備可靠和開放的系統(tǒng),我們開發(fā)了人員基礎信息管理系統(tǒng)。
人員基礎信息管理系統(tǒng),是以企業(yè)對人力資源的管理方式為實例而設計的一種實用型管理系統(tǒng)。本系統(tǒng)的特點是通用性、簡單操作性,適用于同行業(yè)以及一些同類型的企業(yè)管理。不但讓人力資源部的管理人員從繁重的工作中解脫出來,而且由于是自主研發(fā),降低了開發(fā)成本,滿足了我院的需求。
2.2 數(shù)據(jù)批量轉(zhuǎn)移在此系統(tǒng)中存在的必要性
軟件從對新員工的加入后,便可對其信息進行永久維護。主要包括:基本信息(姓名、年齡、出生、科室、照片等)的新增與修改、員工科室調(diào)動、科室信息新增與修改、員工的在職和離崗等等。最關鍵的是當有其他系統(tǒng)需要大量調(diào)用員工信息時,通過批量導出功能可將員工信息以Excel表格的形式批量保存出來,有利于外部人員的統(tǒng)計工作。這一功能就由POI框架來實現(xiàn)。其效果如圖2。
選擇要導出的部門,再點擊工具欄中的“導出”按鈕。會出現(xiàn)提示保存的界面,默認保存為Excel(97-2003)格式。表格可以羅列出每個人的信息,包括:民族、部門、辦公室電話、郵箱等。只需對這些數(shù)據(jù)稍作相關字段的調(diào)整,便可被其他管理軟件所使用,提高了辦事效率。
2.3 數(shù)據(jù)轉(zhuǎn)移過程
我們選擇Hibernate3.2作為對象/關系映射的解決方案,由它負責Java對象和關系數(shù)據(jù)之間的映射。通常通過poi.jar中的HibernateUtil.java設計數(shù)據(jù)庫中的字段,并進行文件配置,在這里可根據(jù)要開發(fā)的系統(tǒng)實際需求自行編寫一個ExportUtil.java,根據(jù)Excel的模板,將存放數(shù)據(jù)序列的變量data中的信息與模板中的模板變量進行融合,返回合并后Excel文件的輸出流。在Excel的模板中,使用第一個sheet。模板變量所在行必須連續(xù),當遇見空cell時,將不分析后面的cell。因為Excel的模板文件支持xls和xlsx兩種文件格式。 輸出的Excel以模板文件的格式為準。即模板是xls輸出也是xls,模板是xlsx輸出也會是xlsx。如果data為null或者size為0,則返回的excel中沒有數(shù)據(jù),即將模板變量對應的單元格置為空。
圖4 數(shù)據(jù)庫系統(tǒng)的組成
3.1 識別用戶數(shù)據(jù)的模板變量
我們在WEB系統(tǒng)的頁面上所看到的諸如“姓名”、“部門簡稱”、“職稱”等字段名下的內(nèi)容,實際是通過模板變量進行輸出。根據(jù)數(shù)據(jù)傳輸協(xié)議變量必須為英文,因此變量名不能為中文,并且不同字段名的模板變量也不同,我們將變量定義為“{name}”、“{dept.name}”等,程序會通過識別“{}”內(nèi)的名字來找到數(shù)據(jù)庫中對應字段的內(nèi)容,并將它取出。其程序如下:
3.2 驗證Excel合法性
討論了導出Excel要面臨的問題后,再來看一下如果要導入Excel文件時需要注意的問題。因為poi開發(fā)包對2003版Excel和2007版Excel使用的是不同的子項目HSSF和XSSF,生成的工作簿對象也不相同,如果不判斷出是哪個版本的Excel,就無法讀取Excel中的內(nèi)容。因此在讀取文件輸入流時需要先對文件輸入流(FileInputStream)進行判斷。判斷程序如下:
得到了合法的輸入流(fileInputStream)后,便可得到對應工作簿(Workbook)對象,根據(jù)1.3.1節(jié)介紹的讀取文件流程,通過判斷每個單元格(Cell)中內(nèi)容的格式,正確的輸出數(shù)據(jù)。常用的格式有:CELL_TYPE_NUMERIC( 數(shù)字型)、CELL_TYPE_FORMULA( 公式型)、CELL_TYPE_STRING( 字符串型)、CELL_TYPE_BOOLEAN( 布爾型),數(shù)字型時還應判斷是否日期格式,否則輸出內(nèi)容有誤。
POI框架已應用于我院運行的主要WEB管理系統(tǒng),包括設計流程管理系統(tǒng)、檔案管理系統(tǒng)、人員基礎信息管理系統(tǒng),以及正在開發(fā)階段的人工時考核系統(tǒng),其適應性可見一斑,穩(wěn)定性得到考驗,并且相對其他開發(fā)包如JXL只能讀取(97-2003)Excel文檔的缺陷,POI框架還可讀取2007版以上的Excel文檔,可對單元格的具體屬性進行編輯,具有廣泛通用性。目前國外的POI框架創(chuàng)作小組還在不斷更新其功能,擴展性很強,未來在各類管理系統(tǒng)中的應用前景必將是一片光明。
Poor Obfuscation Implementation base on the application in Enterprise Management Software
Sun Jing
Information Center, Department of Equipment, Xinjiang Petroleum Investigation Design and Research Institute, Xinjiang 834
In Enterprise Office System, the user often read report by Excel or used to print it by Excel. The POI project of Apache what purpose is deal with the object of OLE2has established technique what the interface of HSSF that deal with the object of Excel for 2003edition, and the interface of XSSF that deal with the object of Excel for 2007edition. It doesn’t like something converted by Excel and generated to formless by CSV for us, b’ust ait real object of Excel that you can control some attribute such as shell, cell and so on.
10.3969/j.issn.1001-8972.2011.11.112
圖2 顯示人員信息界面
圖3 導出的指定科室人員名單
孫晶(1983-),男,新疆石油勘察設計研究院信息中心工作,現(xiàn)主要從事Java語言web開發(fā)。