diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/util/PoiExcelTempUtil.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/util/PoiExcelTempUtil.java new file mode 100644 index 0000000..53869e6 --- /dev/null +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/util/PoiExcelTempUtil.java @@ -0,0 +1,92 @@ +package cn.afterturn.easypoi.util; + +import org.apache.poi.ss.usermodel.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * poi 4.0 07版本在 shift操作下有bug,不移动了单元格以及单元格样式,没有移动cell + * cell还是复用的原理的cell,导致wb输出的时候没有输出值 + * 等待修复的时候删除这个问题 + * + * @author by jueyue on 19-6-17. + */ +public class PoiExcelTempUtil { + + /** + * 把这N行的数据,cell重新设置下,修复因为shift的浅复制问题,导致文本不显示的错误 + * + * @param sheet + * @param startRow + * @param endRow + */ + public static void reset(Sheet sheet, int startRow, int endRow) { + for (int i = startRow; i <= endRow; i++) { + Row row = sheet.getRow(i); + int cellNum = row.getLastCellNum(); + for (int j = 0; j < cellNum; j++) { + Map map = copyCell(row.getCell(j)); + row.removeCell(row.getCell(j)); + Cell cell = row.createCell(j); + cell.setCellStyle((CellStyle) map.get("cellStyle")); + if ((boolean) map.get("isDate")) { + cell.setCellValue((Date) map.get("value")); + } else { + CellType cellType = (CellType) map.get("cellType"); + switch (cellType) { + case NUMERIC: + cell.setCellValue((double) map.get("value")); + break; + case STRING: + cell.setCellValue((String) map.get("value")); + case FORMULA: + break; + case BLANK: + break; + case BOOLEAN: + cell.setCellValue((boolean) map.get("value")); + case ERROR: + break; + } + } + } + } + + } + + private static Map copyCell(Cell cell) { + Map map = new HashMap<>(); + map.put("cellType", cell.getCellType()); + map.put("isDate", CellType.NUMERIC == cell.getCellType() && DateUtil.isCellDateFormatted(cell)); + map.put("value", getValue(cell)); + map.put("cellStyle", cell.getCellStyle()); + return map; + } + + private static Object getValue(Cell cell) { + if (CellType.NUMERIC == cell.getCellType() && DateUtil.isCellDateFormatted(cell)) { + return cell.getDateCellValue(); + } + switch (cell.getCellType()) { + case _NONE: + return null; + case NUMERIC: + return cell.getNumericCellValue(); + case STRING: + return cell.getStringCellValue(); + case FORMULA: + return cell.getCellFormula(); + case BLANK: + break; + case BOOLEAN: + return cell.getBooleanCellValue(); + case ERROR: + break; + } + return null; + } + + +}