Java導(dǎo)出excel時(shí)合并同一列中相同內(nèi)容的行思路詳解
一、有時(shí)候?qū)С鯡xcel時(shí)需要按類別導(dǎo)出,一大類下好幾個(gè)小類,小類下又有好幾個(gè)小小類,就像下圖:
要實(shí)現(xiàn)這個(gè)也不難,
思路如下:按照大類來循環(huán),如上就是按照張江校區(qū)、徐匯校區(qū)、臨港校區(qū)三個(gè)大類循環(huán),然后再處理小類,因?yàn)楸纠⌒☆惒簧婕昂喜?,所以只涉及處理小類,如果需要處理小小類,還需要在處理一下,具體實(shí)現(xiàn)原理同小類;
每次循環(huán)時(shí)記錄下此次循環(huán)的房屋類型和上次循環(huán)的房屋類型,兩者相同時(shí),要合并的結(jié)束行++,否者,說明這個(gè)房屋類型已經(jīng)循環(huán)完畢(前提是各類型都按順序order by 了,保證相同類型相鄰),開始融合。具體實(shí)現(xiàn)如下:
二、實(shí)現(xiàn)代碼,具體思路已經(jīng)在注釋中了
public void expStatistics(String filePath,String campuscode) { try { WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath)); JxlFormatUtil Jfu = new JxlFormatUtil(); WritableSheet ws = wwb.createSheet("房屋報(bào)表統(tǒng)計(jì)", 0); String[] tableHead = {"校區(qū)名稱:20","房屋類型:30","房屋用途:30","使用面積(㎡):20"}; for (int i = 0; i < tableHead.length; i++) {//每一列的標(biāo)題樣式 ws.addCell(new Label(i, 0, tableHead[i].split(":")[0], JxlFormatUtil.wcHead)); ws.setColumnView(i, Integer.valueOf(tableHead[i].split(":")[1])); } int col = 1;//從第1行開始 //以下變量用來融合相同內(nèi)容 的行 int perCol = col; String perPurpose = "";//上一個(gè)用途類型 String purpose = "";//當(dāng)前用途類型 int startMergeCol = 1;//要融合的第一行 int endMergeCol = 0;//要融合的最后行 boolean flag = true;//用來記錄是否是第一次循環(huán) //根據(jù)搜索條件導(dǎo)出 List<FcxtCampus> campusList = new ArrayList<FcxtCampus>(); if(null != campuscode && !"".equals(campuscode)){ campusList = campusdao.findCampusByCode(campuscode); }else { campusList =campusdao.findCampus(); } for (FcxtCampus campus : campusList) { List<FcxtBuild> builds = builddao.statisticsBuilds(campus.getCampuscode());//獲取所有房屋信息 if(null != builds && builds.size() > 0){ for (FcxtBuild build : builds) { int row = 0;//從第0列開始 ws.addCell(new Label(row++, col, campus.getCampusname(), JxlFormatUtil.wcCenter)); purpose = build.getUsefulpurpose(); if(flag){//如果是第一次循環(huán),將perPurpose初始化,以便后面的第一次判斷 perPurpose = purpose; flag = false; } ws.addCell(new Label(row++, col, FcxtBuild.BUILD_USEFULPURPOSE.get(build.getUsefulpurpose()), JxlFormatUtil.wcCenter)); if(purpose.equals(perPurpose)){ endMergeCol++; }else{//兩者不相同時(shí),融合之前相同的行 ws.mergeCells(1, startMergeCol, 1, endMergeCol); startMergeCol = col; endMergeCol = startMergeCol; perPurpose = purpose; } ws.addCell(new Label(row++, col, FcxtBuild.BUILD_BUILDINGTYPE.get(build.getBuildingtype()), JxlFormatUtil.wcCenter)); ws.addCell(new Label(row++, col, build.getBuildarea().toString(), JxlFormatUtil.wcCenter)); col++; } ws.mergeCells(0, perCol, 0, col-1); perCol = col; } } wwb.write(); wwb.close(); } catch (Exception e) { e.printStackTrace(); } }
總結(jié)
以上所述是小編給大家介紹的Java導(dǎo)出excel時(shí)合并同一列中相同內(nèi)容的行思路詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
LambdaQueryWrapper與QueryWrapper的使用方式
這篇文章主要介紹了LambdaQueryWrapper與QueryWrapper的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05java鏈?zhǔn)絼?chuàng)建json對(duì)象的實(shí)現(xiàn)
本文主要介紹了java中如何通過最簡(jiǎn)單的方式實(shí)現(xiàn)鏈?zhǔn)絼?chuàng)建json對(duì)象,解決創(chuàng)建json代碼臃腫的問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Springboot集成Springbrick實(shí)現(xiàn)動(dòng)態(tài)插件的步驟詳解
這篇文章主要介紹了Springboot集成Springbrick實(shí)現(xiàn)動(dòng)態(tài)插件的詳細(xì)過程,文中的流程通過代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考一下2023-06-06分布式系統(tǒng)中的降級(jí)熔斷設(shè)計(jì)問題面試
這篇文章主要為大家介紹了分布式系統(tǒng)中的降級(jí)熔斷設(shè)計(jì)問題面試解答,有需要的朋友可以借鑒參考下,希望能有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Java實(shí)現(xiàn)文件壓縮與解壓的示例[zip格式,gzip格式]
本篇文章主要介紹了Java實(shí)現(xiàn)文件壓縮與解壓的示例[zip格式,gzip格式],具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01