From f4281208908bb7a71f5d91eccecfd492c7725973 Mon Sep 17 00:00:00 2001 From: wenbei <569063716@qq.com> Date: Thu, 24 Jun 2021 17:34:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E5=AF=BC=E5=87=BA=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=95=B4=E8=A1=8C=E6=88=96=E6=95=B4=E5=88=97=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F=20fix:=E5=8E=9FsetRowStyle?= =?UTF-8?q?=20setColumnStyle=E4=BC=9A=E4=BD=BF=E6=97=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84cell=E4=B9=9F=E6=9C=89=E6=A0=B7=E5=BC=8F=E4=B8=94?= =?UTF-8?q?=E6=9C=89=E6=95=B0=E6=8D=AE=E7=9A=84cell=E7=9A=84=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E4=BC=9A=E8=A2=ABStyleSet=E7=9A=84=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/poi/excel/ExcelWriter.java | 49 +++++++++++++++++++ .../cn/hutool/poi/excel/ExcelWriteTest.java | 38 ++++++++++++++ 2 files changed, 87 insertions(+) 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 80c59d1a9..28e462376 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 @@ -1091,6 +1091,28 @@ public class ExcelWriter extends ExcelBase { return this; } + /** + * 对数据行整行加自定义样式 write后调用 + * + * {@link cn.hutool.poi.excel.ExcelWriter#setRowStyle(int, org.apache.poi.ss.usermodel.CellStyle)} + * 这个方法加的样式会使整行没有数据的单元格也有样式 + * 特别是加背景色时很不美观 且有数据的单元格样式会被StyleSet中的样式覆盖掉 + * @param y 行坐标 + * @param style 自定义的样式 + * @return + * @since + */ + public ExcelWriter setRowStyleIfRowData(int y, CellStyle style) { + if(y < 0) { + throw new IllegalArgumentException("Invalid row number (" + y + ")"); + } + int columnCount = this.getColumnCount(); + for(int i=0;i { return this; } + /** + * 设置整个列的样式 write后调用 + * + * {@link cn.hutool.poi.excel.ExcelWriter#setColumnStyle(int, org.apache.poi.ss.usermodel.CellStyle)} + * 这个方法加的样式会使整列没有数据的单元格也有样式 + * 特别是加背景色时很不美观 且有数据的单元格样式会被StyleSet中的样式覆盖掉 + * @param x 列的索引 + * @param y 行的索引 + * @param style + * @return + * @since + */ + public ExcelWriter setColumnStyleIfColumnDate(int x,int y, CellStyle style) { + if(x < 0) { + throw new IllegalArgumentException("Invalid column number (" + x + ")"); + } + if(y < 0) { + throw new IllegalArgumentException("Invalid row number (" + y + ")"); + } + int rowCount = this.getRowCount(); + int i = y; + for(;i row1 = CollUtil.newArrayList("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); + List row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); + List row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); + List row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); + List row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); + + List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + BigExcelWriter overtimeWriter = ExcelUtil.getBigWriter("e:/excel/single_line.xlsx"); + + overtimeWriter.write(rows,true); + + CellStyle cellStyle = overtimeWriter.getWorkbook().createCellStyle(); + StyleUtil.setBorder(cellStyle, BorderStyle.THIN, IndexedColors.BLACK); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyle.setFillForegroundColor((short)13); + cellStyle.setDataFormat((short)22);//时间格式 + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + //给第三行加背景色 + overtimeWriter.setRowStyleIfRowData(2,cellStyle); + //给第二列加背景色 从第一行开始加(用于控制有表头时) + overtimeWriter.setColumnStyleIfColumnDate(1,0,cellStyle); + + CellStyle cellStyle1 = overtimeWriter.getWorkbook().createCellStyle(); + StyleUtil.setBorder(cellStyle1, BorderStyle.THIN, IndexedColors.BLACK); + cellStyle1.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyle1.setFillForegroundColor((short)13); + cellStyle1.setDataFormat((short)2);//小数保留两位 + cellStyle1.setAlignment(HorizontalAlignment.CENTER); + cellStyle1.setVerticalAlignment(VerticalAlignment.CENTER); + overtimeWriter.setStyle(cellStyle1,5,2);//由于第6列是数字 上面应用了日期格式会错乱,这里单独设置下第六列的格式 + + overtimeWriter.close(); + } @Test @Ignore