?? 從事JAVA開(kāi)發(fā)一年多了,大約有半年都在搞Excel導(dǎo)入導(dǎo)出吧.剛剛交接項(xiàng)目時(shí),還是個(gè)對(duì)Java有些陌生,有些懼怕的.但是因?yàn)槿硕甲吖饬耍?xiàng)目中只有咱一個(gè)開(kāi)發(fā)了,只能擔(dān)起全部的開(kāi)發(fā)維護(hù)責(zé)任,也慢慢成長(zhǎng)了起來(lái).項(xiàng)目中以前的Excel導(dǎo)出用的JXL,因?yàn)榭蛻舻奶厥庑枨螅瑢?dǎo)出并非平時(shí)那么簡(jiǎn)單,涉及到分頁(yè)(每sheet一頁(yè)),還要將數(shù)據(jù)合并.架構(gòu)師寫(xiě)了分頁(yè)的代碼,并寫(xiě)了某個(gè)報(bào)表的導(dǎo)出類,然后其他工程師CV,即便對(duì)于當(dāng)時(shí)沒(méi)多少經(jīng)驗(yàn)的我來(lái)說(shuō),這也很沒(méi)意思,很不好,但是事已至此,我也就只能隨波逐流了.
直到到某一天,客戶提出了由于政策變更要重新制作一套報(bào)表的需求,我才意識(shí)到問(wèn)題的嚴(yán)重性,這樣一個(gè)類一個(gè)類的改,不止麻煩,而且要實(shí)現(xiàn)客戶的那些格式要求(如某列需要加粗,某單元格有上下左邊框等等)都十分麻煩,還會(huì)大大增加代碼復(fù)雜度(需要在各種循環(huán)里判斷),于是萌生了重新構(gòu)架導(dǎo)出功能的想法.
?
--------------------以上為發(fā)泄心情,可以忽略不看--------------------
?
做java的必然要有面向?qū)ο蟮囊庾R(shí),萬(wàn)物皆為對(duì)象,報(bào)表亦如此.一個(gè)Excel報(bào)表,我將其分為七個(gè)部分,那就是首頁(yè)頭信息(只出現(xiàn)在第一頁(yè)),頭信息(每頁(yè)都有),動(dòng)態(tài)信息,尾信息(每頁(yè)都有),尾頁(yè)尾信息(只出現(xiàn)在最后一頁(yè)),統(tǒng)計(jì)信息(所有數(shù)據(jù)之后的那行),頁(yè)碼信息(位置不固定).如下圖所示:
參考了hibernate的orm思想,將excel與對(duì)象映射起來(lái),但由于早期,并不會(huì)寫(xiě)DTD,于是就用某類的靜態(tài)成員變量來(lái)充當(dāng)配置文件.報(bào)表中的動(dòng)態(tài)信息需要用一個(gè)集合來(lái)表示,集合中的每個(gè)對(duì)象代表Excel中動(dòng)態(tài)信息的一行,每個(gè)成員變量代表Excel中的一個(gè)單元格.其他的頭尾信息之類,可以用一個(gè)對(duì)象來(lái)表示.下面簡(jiǎn)要的介紹一下整體思路.
首先,我們需要準(zhǔn)備好模板,用JXL讀取模板,并將其sheet復(fù)制一份出來(lái),在新的sheet上輸出數(shù)據(jù),以免影響到模板上的原有數(shù)據(jù).之后,當(dāng)然是根據(jù)情況分頁(yè),將數(shù)據(jù)分成幾個(gè)list,每個(gè)list代表一頁(yè)的數(shù)據(jù),然后循環(huán)輸出,自然循環(huán)中的控制變量i就成了頁(yè)碼.對(duì)于i為0的時(shí)候也就是第一頁(yè),要將首頁(yè)頭信息輸出,其他的情況下,則要把首頁(yè)頭信息的內(nèi)容清空(模板上寫(xiě)的那部分).之后輸出相應(yīng)的頭信息動(dòng)態(tài)信息尾信息,之后需要判斷是否是最后一頁(yè),對(duì)于最后一頁(yè)我們需要輸出尾頁(yè)尾信息,其他頁(yè)我們需要清空模板中的尾頁(yè)尾信息.這樣報(bào)表摸板便完成了,不敢說(shuō)這樣可以應(yīng)對(duì)任何報(bào)表,但是對(duì)于多數(shù)報(bào)表,我們以后要做的只是配置七大部分的格式,與對(duì)象的映射,就足夠產(chǎn)生一個(gè)xls文件了.
以下便是核心代碼部分的簡(jiǎn)要的介紹.
?
// 讀取模板 ???? tempBook = Workbook.getWorkbook(new File(inPath), workbookSettings); ???? // 創(chuàng)建目標(biāo)對(duì)象 ???? book = Workbook.createWorkbook(new File(outPath), tempBook); ??WritableSheet copySheet=book.getSheet(0); ??WritableSheet sheet=null; ???? //拆分動(dòng)態(tài)數(shù)據(jù)集 ???? List[] lists; ???? //沒(méi)有動(dòng)態(tài)數(shù)據(jù) ???? if(report.getDynamic()==null) ???? { ???? ?book.copySheet(0,report.getName(), 1); ???? ?sheet=book.getSheet(1); ???? ?//填充靜態(tài)數(shù)據(jù)的方法參數(shù)3代表對(duì)應(yīng)的輸出對(duì)象,參數(shù)4為包含配置的對(duì)象,參數(shù)5為相對(duì)位置,參數(shù)6頁(yè)碼 ???? ?fillStaticData(sheet, copySheet, staticData, report.getFirsthead(), 0,1); ???? } ???? else ???? { ???? ?//分頁(yè) ???? ?lists=paging(dynamicData); ???? ?int position=0;//相對(duì)位置 ???? ?for(int i=0;i<lists.length;i++) ???? ?{ ???? ??position=0; ???? ??book.copySheet(0,report.getName(),i+1);//復(fù)制新sheet ???? ??sheet=book.getSheet(i+1); ???? ??if(report.getFirsthead()!=null)//首頁(yè) ???? ??{ ????? ??if(i==0)//輸出首頁(yè)頭信息 ????? ??{ ????? ???position+=fillStaticData(sheet, copySheet,staticData, report.getFirsthead(),0, i);? ????? ??} ????? ??else //清空頭信息 ????? ??{ ????? ???JXXUtil.cutRange(sheet, 0, 0, report.getFirsthead().getRows(), report.getFirsthead().getColumns()); ????? ???JXXUtil.blankRange(sheet, 0, 0, report.getFirsthead().getRows(), report.getFirsthead().getColumns()); ????? ??} ???? ??} ???? ??//輸出頭信息 ???? ??position+=fillStaticData(sheet, copySheet,staticData, report.getAllhead(),position, i); ???? ??if(report.getDynamic().getStartRow()!=0) ???? ??{ ???? ???position=report.getDynamic().getStartRow(); ???? ??} ???? ??//寫(xiě)入動(dòng)態(tài)數(shù)據(jù) ???? ??fillDynamicCell(sheet, copySheet, lists[i], position, report.getDynamic()); ???? ??//相對(duì)位置的計(jì)算 ???? ??position+=lists[i].size(); ???? ??if(i!=lists.length-1)//末頁(yè) ???? ??{ ???? ???if(report.getLasttail()!=null) ???? ???{ ???? ????JXXUtil.cutRange(sheet, position+1, 0,position+1+report.getLasttail().getRows(), report.getLasttail().getColumns()); ????? ???JXXUtil.blankRange(sheet,position+1, 0,position+1+report.getLasttail().getRows(), report.getLasttail().getColumns()); ???? ???} ???? ??} ???? ??position+=fillStaticData(sheet, copySheet,staticData, report.getAlltail(),position, i); ??? ???if(report.getLasttail()!=null) ???? ??{ ??? ????if(i==lists.length-1)//末頁(yè) ????? ??{ ????? ???fillStaticData(sheet, copySheet,staticData, report.getLasttail(),position, i);? ????? ??} ???? ??} ???? ?} ???? } ???? book.removeSheet(0); ?? book.write(); ?? tempBook.close(); ?????book.close();
? 具體的實(shí)現(xiàn)以及JXL處理Excel上的一些困難,以后都會(huì)一一介紹,這次就寫(xiě)到這了.
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
