From 8739e39e73d9c5c0145bae9c7d04d77672b6f0ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=BF=E6=98=8E=E7=A1=95?= <3230630470@qq.com> Date: Sun, 9 Apr 2023 10:29:51 +0800 Subject: [PATCH] =?UTF-8?q?Issue#3048:=20=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E5=8D=95=E5=85=83=E6=A0=BC=E7=B2=BE=E5=BA=A6=20?= =?UTF-8?q?=E6=8D=AE=E5=8D=95=E5=85=83=E6=A0=BC=E5=AE=9E=E9=99=85=E6=95=B0?= =?UTF-8?q?=E5=80=BC=E8=87=AA=E5=8A=A8=E9=80=82=E9=85=8D;=20=20=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E4=B8=BAtrue=E5=90=8E=EF=BC=8C=E6=AF=8F=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E7=B1=BB=E5=9E=8B=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E7=B2=BE=E5=BA=A6=E9=83=BD=E5=8F=AF=E8=87=AA=E5=8A=A8=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E4=B8=BA=20value=E5=AF=B9=E5=BA=94=E7=9A=84=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/poi/excel/ExcelWriter.java | 10 +++++ .../java/cn/hutool/poi/excel/StyleSet.java | 22 ++++++++++- .../cn/hutool/poi/excel/Issue3048Test.java | 39 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 hutool-poi/src/test/java/cn/hutool/poi/excel/Issue3048Test.java 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 39d6cb5cd..dce2693af 100755 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java @@ -307,6 +307,16 @@ public class ExcelWriter extends ExcelBase { return this; } + /** + * 设置 是否数字类型单元格精度根据单元格实际数值自动适配 + * @param autoPrecision + * @return this + */ + public ExcelWriter setNumberAutoPrecision(boolean autoPrecision) { + this.styleSet.setNumberAutoPrecision(autoPrecision); + return this; + } + /** * 获取样式集,样式集可以自定义包括:
* diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java index 24256a862..d2474a761 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java @@ -51,6 +51,10 @@ public class StyleSet implements Serializable { */ protected final CellStyle cellStyleForHyperlink; + /** + * 数字类型单元格精度根据单元格实际数值自动适配 + */ + protected Boolean numberAutoPrecision; /** * 构造 * @@ -78,6 +82,9 @@ public class StyleSet implements Serializable { font.setUnderline((byte) 1); font.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex()); this.cellStyleForHyperlink.setFont(font); + + // 数字类型单元格精度根据单元格实际数值自动适配 + this.setNumberAutoPrecision(false); } /** @@ -126,6 +133,14 @@ public class StyleSet implements Serializable { return this.cellStyleForHyperlink; } + public Boolean getNumberAutoPrecision() { + return numberAutoPrecision; + } + + public void setNumberAutoPrecision(Boolean numberAutoPrecision) { + this.numberAutoPrecision = numberAutoPrecision; + } + /** * 定义所有单元格的边框类型 * @@ -254,7 +269,12 @@ public class StyleSet implements Serializable { // 数字单独定义格式 if ((value instanceof Double || value instanceof Float || value instanceof BigDecimal) && null != this.cellStyleForNumber) { - style = this.cellStyleForNumber; + BigDecimal bigDecimalValue = new BigDecimal(value.toString()); + if(numberAutoPrecision){ + this.cellStyleForNumber.setDataFormat((short)bigDecimalValue.precision()); + }else{ + style = this.cellStyleForNumber; + } } } else if (value instanceof Hyperlink) { // 自定义超链接样式 diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue3048Test.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue3048Test.java new file mode 100644 index 000000000..2e1af14b8 --- /dev/null +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue3048Test.java @@ -0,0 +1,39 @@ +package cn.hutool.poi.excel; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * https://github.com/dromara/hutool/issues/3048 Excel导出javaBean中有BigDecimal类型精度流失 + * + */ +public class Issue3048Test { + @Test + @Ignore + public void excelOutPutBeanListToExcel(){ + List excelExportList = new ArrayList<>(); + excelExportList.add(new TestBean("1", new BigDecimal("1.22"))); + excelExportList.add(new TestBean("2", new BigDecimal("2.342"))); + excelExportList.add(new TestBean("3", new BigDecimal("1.2346"))); + ExcelWriter excelWriter = ExcelUtil.getWriter(true); + excelWriter.setNumberAutoPrecision(true); + excelWriter.write(excelExportList, true); + excelWriter.flush(new File("e:/test.xlsx")); + excelWriter.close(); + } + + @Data + @AllArgsConstructor + static class TestBean{ + private String testKey; + private BigDecimal testValue; + } +}