From ae16121e46f3a57235eba3c205b3fffa94f7b37f Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 24 Jun 2021 23:23:26 +0800 Subject: [PATCH] add style for columns and rows --- CHANGELOG.md | 1 + .../java/cn/hutool/poi/excel/ExcelWriter.java | 37 +++++++------- .../cn/hutool/poi/excel/ExcelWriteTest.java | 51 ++++++++++--------- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d35a456f4..004ab5014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * 【core 】 增加Convert.toSet方法(issue#I3XFG2@Gitee) * 【core 】 CsvWriter增加writeBeans方法(pr#345@Gitee) * 【core 】 新增JAXBUtil(pr#346@Gitee) +* 【poi 】 ExcelWriter新增setColumnStyleIfHasData和setRowStyleIfHasData(pr#347@Gitee) ### 🐞Bug修复 * 【json 】 修复XML转义字符的问题(issue#I3XH09@Gitee) 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 dde414500..ae8e09b37 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 @@ -1093,21 +1093,22 @@ public class ExcelWriter extends ExcelBase { /** * 对数据行整行加自定义样式 仅对数据单元格设置 write后调用 - * + *

* {@link cn.hutool.poi.excel.ExcelWriter#setRowStyle(int, org.apache.poi.ss.usermodel.CellStyle)} * 这个方法加的样式会使整行没有数据的单元格也有样式 * 特别是加背景色时很不美观 且有数据的单元格样式会被StyleSet中的样式覆盖掉 - * @param y 行坐标 + * + * @param y 行坐标 * @param style 自定义的样式 - * @return - * @since + * @return this + * @since 5.7.3 */ - public ExcelWriter setRowStyleIfRowData(int y, CellStyle style) { - if(y < 0) { + public ExcelWriter setRowStyleIfHasData(int y, CellStyle style) { + if (y < 0) { throw new IllegalArgumentException("Invalid row number (" + y + ")"); } int columnCount = this.getColumnCount(); - for(int i=0;i { /** * 设置整个列的样式 仅对数据单元格设置 write后调用 - * + *

* {@link cn.hutool.poi.excel.ExcelWriter#setColumnStyle(int, org.apache.poi.ss.usermodel.CellStyle)} * 这个方法加的样式会使整列没有数据的单元格也有样式 * 特别是加背景色时很不美观 且有数据的单元格样式会被StyleSet中的样式覆盖掉 - * @param x 列的索引 - * @param y 行的索引 - * @param style - * @return - * @since + * + * @param x 列的索引 + * @param y 起始行 + * @param style 样式 + * @return this + * @since 5.7.3 */ - public ExcelWriter setColumnStyleIfColumnData(int x,int y, CellStyle style) { - if(x < 0) { + public ExcelWriter setColumnStyleIfHasData(int x, int y, CellStyle style) { + if (x < 0) { throw new IllegalArgumentException("Invalid column number (" + x + ")"); } - if(y < 0) { + 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); @@ -48,15 +49,15 @@ public class ExcelWriteTest { 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"); + BigExcelWriter overtimeWriter = ExcelUtil.getBigWriter("d:/test/style_line.xlsx"); - overtimeWriter.write(rows,true); + 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.setFillForegroundColor((short) 13); + cellStyle.setDataFormat((short) 22);//时间格式 cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); @@ -66,18 +67,18 @@ public class ExcelWriteTest { //现增加的设置行、列样式的方法 //给第三行加背景色 - overtimeWriter.setRowStyleIfRowData(2,cellStyle); + overtimeWriter.setRowStyleIfHasData(2, cellStyle); //给第二列加背景色 从第一行开始加(用于控制有表头时) - overtimeWriter.setColumnStyleIfColumnData(1,0,cellStyle); + overtimeWriter.setColumnStyleIfHasData(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.setFillForegroundColor((short) 13); + cellStyle1.setDataFormat((short) 2);//小数保留两位 cellStyle1.setAlignment(HorizontalAlignment.CENTER); cellStyle1.setVerticalAlignment(VerticalAlignment.CENTER); - overtimeWriter.setStyle(cellStyle1,5,2);//由于第6列是数字 上面应用了日期格式会错乱,这里单独设置下第六列的格式 + overtimeWriter.setStyle(cellStyle1, 5, 2);//由于第6列是数字 上面应用了日期格式会错乱,这里单独设置下第六列的格式 overtimeWriter.close(); } @@ -553,7 +554,7 @@ public class ExcelWriteTest { @Test @Ignore - public void formatTest(){ + public void formatTest() { final ExcelWriter writer = ExcelUtil.getWriter("d:/test/formatTest.xlsx"); final CellStyle cellStyle = writer.createCellStyle(0, 0); cellStyle.setDataFormat(writer.getWorkbook().createDataFormat().getFormat("yyyy-mm-dd")); @@ -562,7 +563,7 @@ public class ExcelWriteTest { @Test @Ignore - public void writeNumberFormatTest(){ + public void writeNumberFormatTest() { final ExcelWriter writer = ExcelUtil.getWriter("d:/test/formatTest.xlsx"); writer.disableDefaultStyle(); writer.writeRow(ListUtil.toList(51.33333333, 90.111111111)); @@ -574,11 +575,11 @@ public class ExcelWriteTest { @Test @Ignore public void writeSecHeadRowTest() { - List row1 = CollUtil.newArrayList(1,"aa", "bb", "cc", "dd", "ee"); - List row2 = CollUtil.newArrayList(2,"aa1", "bb1", "cc1", "dd1", "ee1"); - List row3 = CollUtil.newArrayList(3,"aa2", "bb2", "cc2", "dd2", "ee2"); - List row4 = CollUtil.newArrayList(4,"aa3", "bb3", "cc3", "dd3", "ee3"); - List row5 = CollUtil.newArrayList(5,"aa4", "bb4", "cc4", "dd4", "ee4"); + List row1 = CollUtil.newArrayList(1, "aa", "bb", "cc", "dd", "ee"); + List row2 = CollUtil.newArrayList(2, "aa1", "bb1", "cc1", "dd1", "ee1"); + List row3 = CollUtil.newArrayList(3, "aa2", "bb2", "cc2", "dd2", "ee2"); + List row4 = CollUtil.newArrayList(4, "aa3", "bb3", "cc3", "dd3", "ee3"); + List row5 = CollUtil.newArrayList(5, "aa4", "bb4", "cc4", "dd4", "ee4"); List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); @@ -595,21 +596,21 @@ public class ExcelWriteTest { font.setFontHeightInPoints((short) 15); font.setFontName("Arial"); //设置边框样式 - StyleUtil.setBorder(cellStyle,BorderStyle.THICK,IndexedColors.RED); + StyleUtil.setBorder(cellStyle, BorderStyle.THICK, IndexedColors.RED); cellStyle.setFont(font); // 合并单元格后的标题行,使用设置好的样式 - writer.merge(0,1,0,row1.size() - 1, "标题XXXXXXXX",cellStyle); + writer.merge(0, 1, 0, row1.size() - 1, "标题XXXXXXXX", cellStyle); Console.log(writer.getCurrentRow()); //设置复杂表头 - writer.merge(2,3,0,0,"序号",true); - writer.merge(2,2,1,2,"AABB",true); - writer.merge(2,3,3,3,"CCCC",true); - writer.merge(2,2,4,5,"DDEE",true); + writer.merge(2, 3, 0, 0, "序号", true); + writer.merge(2, 2, 1, 2, "AABB", true); + writer.merge(2, 3, 3, 3, "CCCC", true); + writer.merge(2, 2, 4, 5, "DDEE", true); writer.setCurrentRow(3); - List sechead = CollUtil.newArrayList("AA","BB","DD","EE"); + List sechead = CollUtil.newArrayList("AA", "BB", "DD", "EE"); writer.writeSecHeadRow(sechead); // 一次性写出内容,使用默认样式 writer.write(rows); @@ -623,7 +624,7 @@ public class ExcelWriteTest { */ @Test @Ignore - public void editTest(){ + public void editTest() { // 生成文件 File file = new File("d:/test/100_.xlsx"); FileUtil.del(file);