From ddd77a696989c424d7228371db6d48d60fcb44e8 Mon Sep 17 00:00:00 2001 From: jueyue Date: Thu, 13 Jun 2019 21:40:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BC=9A=E4=B8=8B=E7=A7=BB?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/ExcelExportOfTemplateUtil.java | 11 +--- .../excel/html/helper/MergedRegionHelper.java | 60 +++++++------------ 2 files changed, 25 insertions(+), 46 deletions(-) diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java index 4ace541..8b496ba 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java @@ -147,14 +147,12 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { rowspan, colspan, mergedRegionHelper); rowIndex += rowspan - 1; } - //不论后面有没有数据,都应该执行的是插入操作 - // && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum() + //修复不论后面有没有数据,都应该执行的是插入操作 if (isShift && datas.size() * rowspan > 1 && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum()) { - cell.getRow().getSheet().shiftRows(cell.getRowIndex() + rowspan, - cell.getRow().getSheet().getLastRowNum(), (datas.size() - 1) * rowspan, true, true); + int lastRowNum = cell.getRow().getSheet().getLastRowNum(); + cell.getRow().getSheet().shiftRows(cell.getRowIndex() + rowspan, lastRowNum, (datas.size() - 1) * rowspan, true, true); mergedRegionHelper.shiftRows(cell.getSheet(), cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan); templateSumHandler.shiftRows(cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan); - } while (its.hasNext()) { Object t = its.next(); @@ -402,9 +400,6 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { //修改需要处理的统计值 handlerSumCell(sheet); - - //修复因为调用shiftRows而被破坏的合并单元格 - mergedRegionHelper.mergeOtherCell(sheet); } private void handlerSumCell(Sheet sheet) { diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/html/helper/MergedRegionHelper.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/html/helper/MergedRegionHelper.java index a6c8f44..f4dc22b 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/html/helper/MergedRegionHelper.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/html/helper/MergedRegionHelper.java @@ -1,26 +1,26 @@ package cn.afterturn.easypoi.excel.html.helper; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import cn.afterturn.easypoi.util.PoiCellUtil; import cn.afterturn.easypoi.util.PoiMergeCellUtil; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + /** * 合并单元格帮助类 * * @author JueYue - * 2015年5月9日 下午2:13:35 + * 2015年5月9日 下午2:13:35 */ public class MergedRegionHelper { private Map mergedCache = new HashMap(); - private Set notNeedCread = new HashSet(); + private Set notNeedCache = new HashSet(); public MergedRegionHelper(Sheet sheet) { getAllMergedRegion(sheet); @@ -29,7 +29,7 @@ public class MergedRegionHelper { private void getAllMergedRegion(Sheet sheet) { int nums = sheet.getNumMergedRegions(); for (int i = 0; i < nums; i++) { - handerMergedString(sheet.getMergedRegion(i).formatAsString()); + handlerMergedString(sheet.getMergedRegion(i), sheet.getMergedRegion(i).formatAsString()); } } @@ -38,7 +38,7 @@ public class MergedRegionHelper { * * @param formatAsString */ - private void handerMergedString(String formatAsString) { + private void handlerMergedString(CellRangeAddress cellRangeAddress, String formatAsString) { String[] strArr = formatAsString.split(":"); if (strArr.length == 2) { int startCol = strArr[0].charAt(0) - 65; @@ -46,7 +46,7 @@ public class MergedRegionHelper { startCol = (startCol + 1) * 26 + (strArr[0].charAt(1) - 65); } int startRol = Integer.valueOf(strArr[0].substring(strArr[0].charAt(1) >= 65 ? 2 : 1)); - int endCol = strArr[1].charAt(0) - 65; + int endCol = strArr[1].charAt(0) - 65; if (strArr[1].charAt(1) >= 65) { endCol = (endCol + 1) * 26 + (strArr[1].charAt(1) - 65); } @@ -55,10 +55,10 @@ public class MergedRegionHelper { new Integer[]{endRol - startRol + 1, endCol - startCol + 1}); for (int i = startRol; i <= endRol; i++) { for (int j = startCol; j <= endCol; j++) { - notNeedCread.add(i + "_" + j); + notNeedCache.add(i + "_" + j); } } - notNeedCread.remove(startRol + "_" + startCol); + notNeedCache.remove(startRol + "_" + startCol); } } @@ -71,7 +71,7 @@ public class MergedRegionHelper { * @return */ public boolean isNeedCreate(int row, int col) { - return !notNeedCread.contains(row + "_" + col); + return !notNeedCache.contains(row + "_" + col); } /** @@ -108,16 +108,18 @@ public class MergedRegionHelper { for (String key : keys) { String[] temp = key.split("_"); if (Integer.parseInt(temp[0]) >= rowIndex) { - Integer[] data = mergedCache.get(key); - String newKey = (Integer.parseInt(temp[0]) + size) + "_" + temp[1]; - if(!mergedCache.containsKey(newKey)){ + Integer[] data = mergedCache.get(key); + String newKey = (Integer.parseInt(temp[0]) + size) + "_" + temp[1]; + if (!mergedCache.containsKey(newKey)) { mergedCache.put(newKey, mergedCache.get(key)); try { // 还原合并单元格 - PoiMergeCellUtil.addMergedRegion(sheet, - Integer.parseInt(temp[0]) + size - 1, Integer.parseInt(temp[0]) + data[0] + size - 2, - Integer.parseInt(temp[1]), Integer.parseInt(temp[1]) + data[1] - 1 - ); + if (!PoiCellUtil.isMergedRegion(sheet, Integer.parseInt(temp[0]) + size - 1, Integer.parseInt(temp[1]))) { + PoiMergeCellUtil.addMergedRegion(sheet, + Integer.parseInt(temp[0]) + size - 1, Integer.parseInt(temp[0]) + data[0] + size - 2, + Integer.parseInt(temp[1]), Integer.parseInt(temp[1]) + data[1] - 1 + ); + } } catch (Exception e) { } } @@ -125,22 +127,4 @@ public class MergedRegionHelper { } } - - - /** - * 把破坏的单元格合并(POI的shiftRows方法会把移动的行的合并单元格拆分) - * @return - */ - public void mergeOtherCell(Sheet sheet) { - Set tempMergeKeySet = mergedCache.keySet(); - for(String mergeKey : tempMergeKeySet) { - String[] row_col = mergeKey.split("_"); - if(!PoiCellUtil.isMergedRegion(sheet, Integer.valueOf(row_col[0]) - 1, Integer.valueOf(row_col[1]))) { - Integer[] mergeCellValue = mergedCache.get(mergeKey); - sheet.addMergedRegion(new CellRangeAddress(Integer.valueOf(row_col[0]) - 1, - Integer.valueOf(row_col[0]) - 1 + mergeCellValue[0] - 1, Integer.valueOf(row_col[1]), - Integer.valueOf(row_col[1]) + mergeCellValue[1] - 1)); - } - } - } }