【摘 要】在許多檢測單位的辦公自動化系統(tǒng)中,需要使用到檢測單位的大量檢測數(shù)據(jù),而這些數(shù)據(jù)存儲于excel文件中,由于不同類型產(chǎn)品的檢測報表存在一定差異,使用簡單的方式讀取excel文件存在代碼可重用性差的問題。在分析各種報表的結(jié)構(gòu)后,運用jxl和xml技術(shù),實現(xiàn)了動態(tài)的將excel報表導(dǎo)入數(shù)據(jù)庫的功能,并且適用于各種不同的報表結(jié)構(gòu)。
【關(guān)鍵詞】excel;檢測報表;jxl;xml
0 引言
在日常工作中,需要將大量包含檢測數(shù)據(jù)的excel檢測報表導(dǎo)入到許多檢測單位的辦公自動化系統(tǒng),為了方便對檢測數(shù)據(jù)的使用,可以使用jxl來對excel文件進行操作。jxl是一個廣泛用于讀寫excel文件的優(yōu)秀的開源工具。Jxl提供了一種簡單的讀取excel文件的方法,該方法的基本思想是:通過jxl中的Workbook獲取表中的sheet,然后通過sheet獲取表中的每一個單元格cell,最后調(diào)用cell的getContents()方法獲取數(shù)據(jù)。該方法可以快速的獲取數(shù)據(jù),但獲取的數(shù)據(jù)不能被靈活的使用。為了靈活使用表中的數(shù)據(jù),實現(xiàn)對表中的每一個數(shù)據(jù)進行操作,可將表中的數(shù)據(jù)存入數(shù)據(jù)庫中,然后系統(tǒng)便可自由的在數(shù)據(jù)庫中獲取相應(yīng)的信息。
基于以上分析,結(jié)合各種檢測報表的結(jié)構(gòu)之間存在的共同特性,運用xml作為中介,實現(xiàn)了動態(tài)將報表導(dǎo)入數(shù)據(jù)庫的功能,解決了代碼重用性差的問題,系統(tǒng)使用人員只需要知道表結(jié)構(gòu),就可以將不同報表動態(tài)存入數(shù)據(jù)庫中,不需要懂得代碼編寫。
1將excel檢測報表中數(shù)據(jù)導(dǎo)入xml
通過對不同檢測報表分析,檢測報表與具有常見報表相同的結(jié)構(gòu),包括4個部分:標(biāo)題、表頭、表體、表尾。標(biāo)題、表頭及表尾具有一鍵一值的關(guān)系,表體中的內(nèi)容可由橫縱坐標(biāo)共同確定。
根據(jù)報表結(jié)構(gòu)特點以及具有的鍵值特性,將報表抽象為3個Java類,KeyNameSet類封裝鍵名、KeyValueSet類封裝每個鍵對應(yīng)的值、TableNameSet類用于封裝不同的表名。
根據(jù)以上分析,按照表格特點配置xml文件,將表格中數(shù)據(jù)存入指定的xml文件中。這里的配置并不需要配置人員懂得xml的運用,只需要根據(jù)程序運行提升進行配置即可,下面給出一個配置舉例。
輸入選擇的sheet的索引位置:0
輸入您要配置tag:table
輸入您要配置key:報表1
結(jié)束xml的配置嗎?yes/no:no
輸入您要配置tag:head
輸入您要配置key:0001表1A
輸入您的值x偏移量:
輸入您的值y偏移量:
結(jié)束xml的配置嗎?yes/no:no
輸入您要配置tag:head
輸入您要配置key:A
輸入您的值x偏移量:1
輸入您的值y偏移量:0
結(jié)束xml的配置嗎?yes/no:yes
配置成功,已生成配置!
通過以上配置,將生成一個xml配置文件,文件內(nèi)容如下:
<?xml version=\"1.0\" encoding=\"GBK\"?>
配置中tag即表示xml文件中的標(biāo)簽,本文中tag的取值有table(標(biāo)題),head(表頭),body(表體),foot(表尾),body-col(表體列),body-row(表體行),這些定義是根據(jù)前面分析的表結(jié)構(gòu)來定義的。偏移量表示所存入的鍵對應(yīng)的值所在excel表中的位置。
2將xml中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫
通過兩個步驟實現(xiàn)該功能,第一步,將前一節(jié)配置所得的xml文件中的所有鍵值對都存入數(shù)據(jù)庫;第二步,根據(jù)存入數(shù)據(jù)庫中的鍵值,查找excel文件中的表格內(nèi)容,存入數(shù)據(jù)庫。
/*將xml配置存入數(shù)據(jù)庫*/
public static void toStroeKeys(String xmlFile){
File file = new File(xmlFile);
SAXReader reader = new SAXReader();
Document doc = 1;
try {
doc = reader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
XmlLoader tbLoader = XmlManeger.getTable(doc);
ArrayList
Connection conn = DbUtil.getConn();
… …
int tableId = DataService.getTableId(tbLoader.getKey().toString()).getId();
for(int i =0;i heads.get(i).setTableId(tableId); DataService.addKey(heads.get(i),conn); } …… DbUtil.close(conn); } 根據(jù)報表結(jié)構(gòu),表頭與表尾中存在有些該鍵沒有對應(yīng)的取值的情況,因而在程序?qū)崿F(xiàn)時加入了一個type屬性來判別鍵所對應(yīng)的取值是否存在,當(dāng)type取值為1時,表示該鍵有對應(yīng)的取值,則將該值取出,存入數(shù)據(jù)庫,以表頭存入數(shù)據(jù)庫為說明。 /*將excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫*/ /*------------表--頭---------------/* File file = new File(excelFile); Workbook book = 1; book = Workbook.getWorkbook(file); … … ArrayList KeyValueSet kSet = 1; for(int i=0;i if(heads.get(i).getType()==1){ kSet = new KeyValueSet(); cell = sheet1.getCell(heads.get(i).getX()+heads.get(i).getPx(),heads.get(i).getY()+heads.get(i).getPy()); …… kSet.setKeyValue(cell.getContents()); DataService.addValue(kSet, conn); } } 3結(jié)語 通過對報表結(jié)構(gòu)分析,總結(jié)歸納了報表的一般結(jié)構(gòu),運用xml作為中間的過渡,結(jié)合 jxl實現(xiàn)了動態(tài)的將存于excel中的復(fù)雜的報表結(jié)構(gòu)中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫的功能,導(dǎo)入數(shù)據(jù)的操作人員不需要知道程序代碼如何編寫,只需了解各種報表的結(jié)構(gòu),根據(jù)程序的提示,配置好報表結(jié)構(gòu)即可。 該功能在許多涉及與報表相關(guān)操作的系統(tǒng)中都可以使用,因而在下一步的工作中,可以進一步實現(xiàn)該功能的可視化操作,使其成為一個小的工具應(yīng)用程序,供廣大的需要運用該功能的開發(fā)人員使用。 參考文獻: [1] JXL. Java Excel API (XML) 1.1 [EB/OL]. http://www.andykhan.com/jexcelapi/, 2003-07. [2] 陽瑞發(fā),馮彬.一種導(dǎo)出復(fù)雜Excel報表的設(shè)計與實現(xiàn).計算機系統(tǒng)應(yīng)用[J], 2013,22(2):155-157. [3] 張明輝,王清心,王正玉.基于Java Excel API的數(shù)據(jù)庫數(shù)據(jù)導(dǎo)入導(dǎo)出方法研究與實現(xiàn).現(xiàn)代電子技術(shù)[J],2012,35(4):45-47. 作者簡介: 曾秋麗 1990.9 貴州大學(xué) 大數(shù)據(jù)與信息工程學(xué)院 電子與通信工程專業(yè) 李娜 1988.8 貴州大學(xué) 大數(shù)據(jù)與信息工程學(xué)院 電子與通信工程專業(yè)