From 9e5d075b0d6b5d4d1c8b7a7a0e0c1415171e6bd1 Mon Sep 17 00:00:00 2001 From: SPPan Date: Sat, 27 Nov 2021 22:32:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?POI=E8=AF=BB=E5=8F=96EXCEL=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E4=B8=BA1899=E5=B9=B4=E9=97=AE=E9=A2=98=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/poi/excel/cell/values/NumericCellValue.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/values/NumericCellValue.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/values/NumericCellValue.java index 951af97c2..bf160730e 100755 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/values/NumericCellValue.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/values/NumericCellValue.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelDateUtil; import cn.hutool.poi.excel.cell.CellValue; +import java.util.Date; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.util.NumberToTextConverter; @@ -24,7 +25,7 @@ public class NumericCellValue implements CellValue { * * @param cell {@link Cell} */ - public NumericCellValue(Cell cell){ + public NumericCellValue(Cell cell) { this.cell = cell; } @@ -36,8 +37,13 @@ public class NumericCellValue implements CellValue { if (null != style) { // 判断是否为日期 if (ExcelDateUtil.isDateFormat(cell)) { + // 1899年写入会导致数据错乱,读取到1899年证明这个单元格的信息不关注年月日 + Date dateCellValue = cell.getDateCellValue(); + if ("1899".equals(DateUtil.format(dateCellValue, "yyyy"))) { + return DateUtil.format(dateCellValue, style.getDataFormatString()); + } // 使用Hutool的DateTime包装 - return DateUtil.date(cell.getDateCellValue()); + return DateUtil.date(dateCellValue); } final String format = style.getDataFormatString(); From d8182e94bf4dd3dbae08822e58e3a96c7fc8c9b1 Mon Sep 17 00:00:00 2001 From: SPPan Date: Sat, 27 Nov 2021 22:48:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A01899=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../poi/excel/NumericCellValueTest.java | 26 ++++++++++++++++++ .../src/test/resources/1899bug_demo.xlsx | Bin 0 -> 10677 bytes 2 files changed, 26 insertions(+) create mode 100644 hutool-poi/src/test/java/cn/hutool/poi/excel/NumericCellValueTest.java create mode 100644 hutool-poi/src/test/resources/1899bug_demo.xlsx diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/NumericCellValueTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/NumericCellValueTest.java new file mode 100644 index 000000000..df3cefeb1 --- /dev/null +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/NumericCellValueTest.java @@ -0,0 +1,26 @@ +package cn.hutool.poi.excel; + +import cn.hutool.poi.excel.cell.values.NumericCellValue; +import java.util.Date; +import org.apache.poi.ss.usermodel.Cell; +import org.junit.Test; + +public class NumericCellValueTest { + + @Test + public void writeTest() { + final ExcelReader reader = ExcelUtil.getReader("1899bug_demo.xlsx"); + ExcelWriter writer = ExcelUtil.getWriter("1899bug_write.xlsx"); + Cell cell = reader.getCell(0, 0); + // 直接取值 + // 和CellUtil.getCellValue(org.apache.poi.ss.usermodel.Cell)方法的结果一样 + // 1899-12-31 04:39:00 + Date cellValue = cell.getDateCellValue(); + // 将这个值写入EXCEL中自定义样式的单元格,结果会是-1 + writer.writeCellValue(0, 0, cellValue); + // 修改后的写入,单元格内容正常 + writer.writeCellValue(1, 0, new NumericCellValue(cell).getValue()); + writer.close(); + reader.close(); + } +} diff --git a/hutool-poi/src/test/resources/1899bug_demo.xlsx b/hutool-poi/src/test/resources/1899bug_demo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9424dc470c66174a84860ad79bd16c8fcd61f406 GIT binary patch literal 10677 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 V01JtI$VL?M$%McMn&ywI{{b{~x`hA$ literal 0 HcmV?d00001