From 8fdc4af83652b37e819d42d8f9a4f1776e53acbb Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 9 Mar 2020 10:12:09 +0800 Subject: [PATCH] fix ExcelWriter bug --- CHANGELOG.md | 1 + .../java/cn/hutool/poi/excel/ExcelBase.java | 26 +++++++++-------- .../java/cn/hutool/poi/excel/ExcelWriter.java | 8 ++--- .../cn/hutool/poi/excel/WorkbookUtil.java | 23 +++++++++++++++ .../hutool/poi/excel/test/ExcelWriteTest.java | 29 ++++++++++++++++++- 5 files changed, 70 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3473da7ab..9ec1cad10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * 【setting】 修复Props.toBean方法null的问题 * 【core 】 修复DataUtil.parseLocalDateTime无时间部分报错问题(issue#I1B18H@Gitee) * 【core 】 修复NetUtil.isUsableLocalPort()判断问题(issue#765@Github) +* 【poi 】 修复ExcelWriter写出多个sheet错误的问题(issue#766@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelBase.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelBase.java index bfc192060..bab55d193 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelBase.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelBase.java @@ -115,10 +115,8 @@ public class ExcelBase> implements Closeable { * @return this * @since 4.0.10 */ - @SuppressWarnings("unchecked") public T setSheet(String sheetName) { - WorkbookUtil.getOrCreateSheet(this.workbook, sheetName); - return (T) this; + return setSheet(WorkbookUtil.getOrCreateSheet(this.workbook, sheetName)); } /** @@ -129,16 +127,20 @@ public class ExcelBase> implements Closeable { * @return this * @since 4.0.10 */ - @SuppressWarnings("unchecked") public T setSheet(int sheetIndex) { - try { - this.sheet = this.workbook.getSheetAt(sheetIndex); - } catch (IllegalArgumentException e) { - this.sheet = this.workbook.createSheet(); - } - if (null == this.sheet) { - this.sheet = this.workbook.createSheet(); - } + return setSheet(WorkbookUtil.getOrCreateSheet(this.workbook, sheetIndex)); + } + + /** + * 设置自定义Sheet + * + * @param sheet 自定义sheet,可以通过{@link WorkbookUtil#getOrCreateSheet(Workbook, String)} 创建 + * @return this + * @since 5.2.1 + */ + @SuppressWarnings("unchecked") + public T setSheet(Sheet sheet) { + this.sheet = sheet; return (T) this; } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java index 2729e8cae..bb0661a7d 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java @@ -804,7 +804,7 @@ public class ExcelWriter extends ExcelBase { Map rowMap; if (rowBean instanceof Map) { if (MapUtil.isNotEmpty(this.headerAlias)) { - rowMap = MapUtil.newTreeMap((Map) rowBean, getInitedAliasComparator()); + rowMap = MapUtil.newTreeMap((Map) rowBean, getCachedAliasComparator()); } else { rowMap = (Map) rowBean; } @@ -813,7 +813,7 @@ public class ExcelWriter extends ExcelBase { rowMap = BeanUtil.beanToMap(rowBean, new LinkedHashMap<>(), false, false); } else { // 别名存在情况下按照别名的添加顺序排序Bean数据 - rowMap = BeanUtil.beanToMap(rowBean, new TreeMap<>(getInitedAliasComparator()), false, false); + rowMap = BeanUtil.beanToMap(rowBean, new TreeMap<>(getCachedAliasComparator()), false, false); } } else { // 其它转为字符串默认输出 @@ -1047,7 +1047,7 @@ public class ExcelWriter extends ExcelBase { return rowMap; } - final Map filteredMap = new LinkedHashMap<>(); + final Map filteredMap = MapUtil.newHashMap(rowMap.size(), true); String aliasName; for (Entry entry : rowMap.entrySet()) { aliasName = this.headerAlias.get(StrUtil.toString(entry.getKey())); @@ -1068,7 +1068,7 @@ public class ExcelWriter extends ExcelBase { * @return Comparator * @since 4.1.5 */ - private Comparator getInitedAliasComparator() { + private Comparator getCachedAliasComparator() { if (MapUtil.isEmpty(this.headerAlias)) { return null; } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java index 8638630cd..9bc774860 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/WorkbookUtil.java @@ -254,6 +254,29 @@ public class WorkbookUtil { return sheet; } + /** + * 获取或者创建sheet表
+ * 自定义需要读取或写出的Sheet,如果给定的sheet不存在,创建之(命名为默认)
+ * 在读取中,此方法用于切换读取的sheet,在写出时,此方法用于新建或者切换sheet + * + * @param book 工作簿{@link Workbook} + * @param sheetIndex 工作表序号 + * @return 工作表{@link Sheet} + * @since 5.2.1 + */ + public static Sheet getOrCreateSheet(Workbook book, int sheetIndex) { + Sheet sheet = null; + try { + sheet = book.getSheetAt(sheetIndex); + } catch (IllegalArgumentException ignore) { + //ignore + } + if (null == sheet) { + sheet = book.createSheet(); + } + return sheet; + } + /** * * sheet是否为空 diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java index 70571fd60..88015027c 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java @@ -2,9 +2,12 @@ package cn.hutool.poi.excel.test; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.TreeMap; +import cn.hutool.core.util.IdUtil; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.Font; @@ -410,7 +413,31 @@ public class ExcelWriteTest { List row = CollUtil.newArrayList("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); ExcelWriter overtimeWriter = ExcelUtil.getWriter("f:/excel/single_line.xlsx"); overtimeWriter.writeCellValue(3, 4, "AAAA"); - overtimeWriter.addSelect(3, 4, row.toArray(new String[row.size()])); + overtimeWriter.addSelect(3, 4, row.toArray(new String[0])); overtimeWriter.close(); } + + @Test + @Ignore + public void writeMultiSheetTest(){ + List> rows = new LinkedList<>(); + for (int i = 0; i < 10; i++) { + Map tempList = new TreeMap<>(); + for (int j = 0; j < 10; j++) { + tempList.put(j + "", IdUtil.randomUUID()); + } + rows.add(tempList); + } + ExcelWriter writer = ExcelUtil.getWriter("D:\\test\\multiSheet.xlsx", "正常数据"); + writer.write(rows, true); + writer.autoSizeColumnAll(); + + writer.setSheet("当前重复数据"); + writer.write(rows, true); + writer.autoSizeColumnAll(); + writer.setSheet("历史重复数据"); + writer.write(rows, true); + writer.autoSizeColumnAll(); + writer.close(); + } }