欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

JXL制作屬于自己的excel導(dǎo)入導(dǎo)出報(bào)表工具(一)背

系統(tǒng) 1609 0

?? 從事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è)碼信息(位置不固定).如下圖所示:

?????????     JXL制作屬于自己的excel導(dǎo)入導(dǎo)出報(bào)表工具(一)背景和思路

  參考了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ě)到這了.

JXL制作屬于自己的excel導(dǎo)入導(dǎo)出報(bào)表工具(一)背景和思路


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 天天影视免费在线观看入口 | 久久国产色 | 久久亚洲国产精品无码一区 | 久久99综合 | 日韩免费一级片 | 久草青青在线视频 | 欧美成熟丰满老妇xxxx | 国产精品成人在线观看 | 亚洲一二三四2021不卡 | 免费一级视频在线观看 | 久久久久久久久久免观看 | 黄在线观看+在线播放 | 亚洲有码转帖 | 色秀视频免费网站在线观看 | 天天夜干| 日韩和的一区二在线 | 97天堂| 毛片免费视频 | 日韩欧美在线中文字幕 | 久久一区二区三区四区 | 久草在线免费新视频 | 亚洲1区2区3区4区 | 免费一级毛片在线播放欧美 | 精品亚洲一区二区三区 | 国产亚洲精品久久久久久小说 | 91福利精品老师国产自产在线 | 青青草视频破解版 | 日本一区二区在线视频 | 天天操天天干天天操 | 国产香蕉免费精品视频 | 又黄又爽的成人免费网站 | 天天色影 | 成年男女男免费视频网站不卡 | 色五月丁香五月综合五月 | 成人精品网| 超碰人操 | 久久中文字幕久久久久91 | 免费日本视频 | www.最色 | 久久男人视频 | 一区二区三区福利视频 |