add style for columns and rows

This commit is contained in:
Looly 2021-06-24 23:23:26 +08:00
parent 04e0e10fc4
commit ae16121e46
3 changed files with 46 additions and 43 deletions

View File

@ -9,6 +9,7 @@
* 【core 】 增加Convert.toSet方法issue#I3XFG2@Gitee
* 【core 】 CsvWriter增加writeBeans方法pr#345@Gitee
* 【core 】 新增JAXBUtilpr#346@Gitee
* 【poi 】 ExcelWriter新增setColumnStyleIfHasData和setRowStyleIfHasDatapr#347@Gitee
### 🐞Bug修复
* 【json 】 修复XML转义字符的问题issue#I3XH09@Gitee

View File

@ -1093,21 +1093,22 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/**
* 对数据行整行加自定义样式 仅对数据单元格设置 write后调用
*
* <p>
* {@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<columnCount;i++){
for (int i = 0; i < columnCount; i++) {
this.setStyle(style, i, y);
}
return this;
@ -1128,26 +1129,26 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/**
* 设置整个列的样式 仅对数据单元格设置 write后调用
*
* <p>
* {@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<rowCount;i++){
for (int i = y; i < rowCount; i++) {
this.setStyle(style, x, i);
}
return this;

View File

@ -38,9 +38,10 @@ import java.util.TreeMap;
* @author looly
*/
public class ExcelWriteTest {
@Test
// @Ignore
public void testRowOrColumnCellStyle(){
public void testRowOrColumnCellStyle() {
List<?> 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<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<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<String> sechead = CollUtil.newArrayList("AA","BB","DD","EE");
List<String> 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);