diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java index b0c2912..922ebe3 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java @@ -48,6 +48,7 @@ import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; import org.jeecgframework.poi.excel.entity.params.MergeEntity; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.jeecgframework.poi.excel.export.styler.IExcelExportStyler; +import org.jeecgframework.poi.util.PoiMergeCellUtil; import org.jeecgframework.poi.util.PoiPublicUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,8 +60,9 @@ import org.slf4j.LoggerFactory; * @date 2014年6月17日 下午6:15:13 */ public abstract class ExcelExportBase extends ExportBase { - - private static final Logger LOGGER = LoggerFactory.getLogger(ExcelExportBase.class); + + private static final Logger LOGGER = LoggerFactory + .getLogger(ExcelExportBase.class); private int currentIndex = 0; @@ -72,25 +74,6 @@ public abstract class ExcelExportBase extends ExportBase { private IExcelExportStyler excelExportStyler; - private boolean checkIsEqualByCellContents(MergeEntity mergeEntity, String text, Cell cell, - int[] delys, int rowNum) { - // 没有依赖关系 - if (delys == null || delys.length == 0) { - return mergeEntity.getText().equals(text); - } - // 存在依赖关系 - if (mergeEntity.getText().equals(text)) { - for (int i = 0; i < delys.length; i++) { - if (!getCellNotNullText(cell, delys[i], rowNum).equals( - mergeEntity.getRelyList().get(i))) { - return false; - } - } - return true; - } - return false; - } - /** * 创建 最主要的 Cells * @@ -110,7 +93,7 @@ public abstract class ExcelExportBase extends ExportBase { for (int k = indexKey, paramSize = excelParams.size(); k < paramSize; k++) { entity = excelParams.get(k); if (entity.getList() != null) { - Collection list = getListCellValue(entity,t); + Collection list = getListCellValue(entity, t); int listC = 0; for (Object obj : list) { createListCells(patriarch, index + listC, cellNum, obj, entity.getList(), @@ -194,7 +177,7 @@ public abstract class ExcelExportBase extends ExportBase { patriarch.createPicture(anchor, row.getSheet().getWorkbook().addPicture(value, getImageType(value))); } catch (IOException e) { - LOGGER.error(e.getMessage(),e); + LOGGER.error(e.getMessage(), e); } } else { byte[] value = (byte[]) (entity.getMethods() != null ? getFieldBySomeMethod( @@ -248,16 +231,6 @@ public abstract class ExcelExportBase extends ExportBase { } } - private MergeEntity createMergeEntity(String text, int rowNum, Cell cell, int[] delys) { - MergeEntity mergeEntity = new MergeEntity(text, rowNum, rowNum); - List list = new ArrayList(delys.length); - mergeEntity.setRelyList(list); - for (int i = 0; i < delys.length; i++) { - list.add(getCellNotNullText(cell, delys[i], rowNum)); - } - return mergeEntity; - } - /** * 创建文本类型的Cell * @@ -326,22 +299,6 @@ public abstract class ExcelExportBase extends ExportBase { } } - /** - * 获取一个单元格的值,确保这个单元格必须有值,不然向上查询 - * - * @param cell - * @param index - * @param rowNum - * @return - */ - private String getCellNotNullText(Cell cell, int index, int rowNum) { - String temp = cell.getRow().getCell(index).getStringCellValue(); - while (StringUtils.isEmpty(temp)) { - temp = cell.getRow().getSheet().getRow(--rowNum).getCell(index).getStringCellValue(); - } - return temp; - } - /** * 获取导出报表的字段总长度 * @@ -406,50 +363,6 @@ public abstract class ExcelExportBase extends ExportBase { return excelExportStyler.getStyles(needOne, entity); } - /** - * 处理合并单元格 - * - * @param index - * @param rowNum - * @param text - * @param mergeDataMap - * @param sheet - * @param cell - * @param delys - */ - private void hanlderMergeCells(Integer index, int rowNum, String text, - Map mergeDataMap, Sheet sheet, Cell cell, - int[] delys) { - if (mergeDataMap.containsKey(index)) { - if (checkIsEqualByCellContents(mergeDataMap.get(index), text, cell, delys, rowNum)) { - mergeDataMap.get(index).setEndRow(rowNum); - } else { - sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), - mergeDataMap.get(index).getEndRow(), index, index)); - mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys)); - } - } else { - mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys)); - } - } - - /** - * 字符为空的情况下判断 - * - * @param index - * @param mergeDataMap - * @param sheet - */ - private void mergeCellOrContinue(Integer index, Map mergeDataMap, - Sheet sheet) { - if (mergeDataMap.containsKey(index) - && mergeDataMap.get(index).getEndRow() != mergeDataMap.get(index).getStartRow()) { - sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), - mergeDataMap.get(index).getEndRow(), index, index)); - mergeDataMap.remove(index); - } - } - /** * 合并单元格 * @@ -459,36 +372,7 @@ public abstract class ExcelExportBase extends ExportBase { */ public void mergeCells(Sheet sheet, List excelParams, int titleHeight) { Map mergeMap = getMergeDataMap(excelParams); - Map mergeDataMap = new HashMap(); - if (mergeMap.size() == 0) { - return; - } - Row row; - Set sets = mergeMap.keySet(); - String text; - for (int i = titleHeight; i <= sheet.getLastRowNum(); i++) { - row = sheet.getRow(i); - for (Integer index : sets) { - if (row.getCell(index) == null) { - mergeDataMap.get(index).setEndRow(i); - } else { - text = row.getCell(index).getStringCellValue(); - if (StringUtils.isNotEmpty(text)) { - hanlderMergeCells(index, i, text, mergeDataMap, sheet, row.getCell(index), - mergeMap.get(index)); - } else { - mergeCellOrContinue(index, mergeDataMap, sheet); - } - } - } - } - if (mergeDataMap.size() > 0) { - for (Integer index : mergeDataMap.keySet()) { - sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), - mergeDataMap.get(index).getEndRow(), index, index)); - } - } - + PoiMergeCellUtil.mergeCells(sheet, mergeMap, titleHeight); } public void setCellWith(List excelParams, Sheet sheet) { diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiMergeCellUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiMergeCellUtil.java new file mode 100644 index 0000000..5720dff --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiMergeCellUtil.java @@ -0,0 +1,155 @@ +package org.jeecgframework.poi.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; +import org.jeecgframework.poi.excel.entity.params.MergeEntity; + +/** + * 纵向合并单元格工具类 + * @author JueYue + * @date 2015年6月21日 上午11:21:40 + */ +public final class PoiMergeCellUtil { + + private PoiMergeCellUtil() { + } + + /** + * 纵向合并相同内容的单元格 + * + * @param sheet + * @param mergeMap key--列,value--依赖的列,没有传空 + * @param startRow 开始行 + */ + public static void mergeCells(Sheet sheet, Map mergeMap, int startRow) { + Map mergeDataMap = new HashMap(); + if (mergeMap.size() == 0) { + return; + } + Row row; + Set sets = mergeMap.keySet(); + String text; + for (int i = startRow; i <= sheet.getLastRowNum(); i++) { + row = sheet.getRow(i); + for (Integer index : sets) { + if (row.getCell(index) == null) { + mergeDataMap.get(index).setEndRow(i); + } else { + text = row.getCell(index).getStringCellValue(); + if (StringUtils.isNotEmpty(text)) { + hanlderMergeCells(index, i, text, mergeDataMap, sheet, row.getCell(index), + mergeMap.get(index)); + } else { + mergeCellOrContinue(index, mergeDataMap, sheet); + } + } + } + } + if (mergeDataMap.size() > 0) { + for (Integer index : mergeDataMap.keySet()) { + sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), + mergeDataMap.get(index).getEndRow(), index, index)); + } + } + + } + + /** + * 处理合并单元格 + * + * @param index + * @param rowNum + * @param text + * @param mergeDataMap + * @param sheet + * @param cell + * @param delys + */ + private static void hanlderMergeCells(Integer index, int rowNum, String text, + Map mergeDataMap, Sheet sheet, + Cell cell, int[] delys) { + if (mergeDataMap.containsKey(index)) { + if (checkIsEqualByCellContents(mergeDataMap.get(index), text, cell, delys, rowNum)) { + mergeDataMap.get(index).setEndRow(rowNum); + } else { + sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), + mergeDataMap.get(index).getEndRow(), index, index)); + mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys)); + } + } else { + mergeDataMap.put(index, createMergeEntity(text, rowNum, cell, delys)); + } + } + + /** + * 字符为空的情况下判断 + * + * @param index + * @param mergeDataMap + * @param sheet + */ + private static void mergeCellOrContinue(Integer index, Map mergeDataMap, + Sheet sheet) { + if (mergeDataMap.containsKey(index) + && mergeDataMap.get(index).getEndRow() != mergeDataMap.get(index).getStartRow()) { + sheet.addMergedRegion(new CellRangeAddress(mergeDataMap.get(index).getStartRow(), + mergeDataMap.get(index).getEndRow(), index, index)); + mergeDataMap.remove(index); + } + } + + private static MergeEntity createMergeEntity(String text, int rowNum, Cell cell, int[] delys) { + MergeEntity mergeEntity = new MergeEntity(text, rowNum, rowNum); + List list = new ArrayList(delys.length); + mergeEntity.setRelyList(list); + for (int i = 0; i < delys.length; i++) { + list.add(getCellNotNullText(cell, delys[i], rowNum)); + } + return mergeEntity; + } + + private static boolean checkIsEqualByCellContents(MergeEntity mergeEntity, String text, + Cell cell, int[] delys, int rowNum) { + // 没有依赖关系 + if (delys == null || delys.length == 0) { + return mergeEntity.getText().equals(text); + } + // 存在依赖关系 + if (mergeEntity.getText().equals(text)) { + for (int i = 0; i < delys.length; i++) { + if (!getCellNotNullText(cell, delys[i], rowNum).equals( + mergeEntity.getRelyList().get(i))) { + return false; + } + } + return true; + } + return false; + } + + /** + * 获取一个单元格的值,确保这个单元格必须有值,不然向上查询 + * + * @param cell + * @param index + * @param rowNum + * @return + */ + private static String getCellNotNullText(Cell cell, int index, int rowNum) { + String temp = cell.getRow().getCell(index).getStringCellValue(); + while (StringUtils.isEmpty(temp)) { + temp = cell.getRow().getSheet().getRow(--rowNum).getCell(index).getStringCellValue(); + } + return temp; + } + +}