1、注解形式自定义样式

since 2.2.0-beta1

excel示例

image.png

对象

注解

  1. //设置导出的列宽@ColumnWidth(20)
  2. @ColumnWidth(20)
  3. //表头行高设定,要写在class类上,不是字段上
  4. @HeadRowHeight(10)
  5. //字段内容行高设定,要写在class类上,不是字段上
  6. @ContentRowHeight(20)
  1. @Getter
  2. @Setter
  3. @EqualsAndHashCode
  4. // 头背景设置成红色 IndexedColors.RED.getIndex()
  5. @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 10)
  6. // 头字体设置成20
  7. @HeadFontStyle(fontHeightInPoints = 20)
  8. // 内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
  9. @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
  10. // 内容字体设置成20
  11. @ContentFontStyle(fontHeightInPoints = 20)
  12. public class DemoStyleData {
  13. // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
  14. @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 14)
  15. // 字符串的头字体设置成20
  16. @HeadFontStyle(fontHeightInPoints = 30)
  17. // 字符串的内容的背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
  18. @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
  19. // 字符串的内容字体设置成20
  20. @ContentFontStyle(fontHeightInPoints = 30)
  21. @ExcelProperty("字符串标题")
  22. private String string;
  23. @ExcelProperty("日期标题")
  24. private Date date;
  25. @ExcelProperty("数字标题")
  26. private Double doubleData;
  27. }/**
  28. * 样式的数据类
  29. *
  30. * @author Jiaju Zhuang
  31. **/
  32. @Data
  33. // 头背景设置成红色 IndexedColors.RED.getIndex()
  34. @HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 10)
  35. // 头字体设置成20
  36. @HeadFontStyle(fontHeightInPoints = 20)
  37. // 内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
  38. @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 17)
  39. // 内容字体设置成20
  40. @ContentFontStyle(fontHeightInPoints = 20)
  41. public class DemoStyleData {
  42. // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
  43. @HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 14)
  44. // 字符串的头字体设置成20
  45. @HeadFontStyle(fontHeightInPoints = 30)
  46. // 字符串的内容的背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
  47. @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)
  48. // 字符串的内容字体设置成20
  49. @ContentFontStyle(fontHeightInPoints = 30)
  50. @ExcelProperty("字符串标题")
  51. private String string;
  52. @ExcelProperty("日期标题")
  53. private Date date;
  54. @ExcelProperty("数字标题")
  55. private Double doubleData;
  56. }

代码

  1. /**
  2. * 注解形式自定义样式
  3. * <p>
  4. * 1. 创建excel对应的实体对象 参照{@link DemoStyleData}
  5. * <p>
  6. * 3. 直接写即可
  7. *
  8. * @since 2.2.0-beta1
  9. */
  10. @Test
  11. public void annotationStyleWrite() {
  12. String fileName = TestFileUtil.getPath() + "annotationStyleWrite" + System.currentTimeMillis() + ".xlsx";
  13. // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
  14. EasyExcel.write(fileName, DemoStyleData.class).sheet("模板").doWrite(data());
  15. }

2、拦截器形式自定义样式

参考:easyexcel导出时修改默认表头及表体样式

excel示例

EasyExcel自定义样式,注解和拦截器2种 - 图2

对象

参照:对象

代码

  1. /**
  2. * 拦截器形式自定义样式
  3. * <p>
  4. * 1. 创建excel对应的实体对象 参照{@link DemoData}
  5. * <p>
  6. * 2. 创建一个style策略 并注册
  7. * <p>
  8. * 3. 直接写即可
  9. */
  10. @Test
  11. public void handlerStyleWrite() {
  12. // 方法1 使用已有的策略 推荐
  13. // HorizontalCellStyleStrategy 每一行的样式都一样 或者隔行一样
  14. // AbstractVerticalCellStyleStrategy 每一列的样式都一样 需要自己回调每一页
  15. String fileName = TestFileUtil.getPath() + "handlerStyleWrite" + System.currentTimeMillis() + ".xlsx";
  16. // 头的策略
  17. WriteCellStyle headWriteCellStyle = new WriteCellStyle();
  18. // 背景设置为红色
  19. headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
  20. WriteFont headWriteFont = new WriteFont();
  21. headWriteFont.setFontHeightInPoints((short)20);
  22. headWriteCellStyle.setWriteFont(headWriteFont);
  23. // 内容的策略
  24. WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
  25. // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
  26. contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
  27. // 背景绿色
  28. contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
  29. WriteFont contentWriteFont = new WriteFont();
  30. // 字体大小
  31. contentWriteFont.setFontHeightInPoints((short)20);
  32. contentWriteCellStyle.setWriteFont(contentWriteFont);
  33. // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
  34. HorizontalCellStyleStrategy horizontalCellStyleStrategy =
  35. new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
  36. // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
  37. EasyExcel.write(fileName, DemoData.class)
  38. .registerWriteHandler(horizontalCellStyleStrategy)
  39. .sheet("模板")
  40. .doWrite(data());
  41. // 方法2: 使用easyexcel的方式完全自己写 不太推荐 尽量使用已有策略
  42. // @since 3.0.0-beta2
  43. fileName = TestFileUtil.getPath() + "handlerStyleWrite" + System.currentTimeMillis() + ".xlsx";
  44. EasyExcel.write(fileName, DemoData.class)
  45. .registerWriteHandler(new CellWriteHandler() {
  46. @Override
  47. public void afterCellDispose(CellWriteHandlerContext context) {
  48. // 当前事件会在 数据设置到poi的cell里面才会回调
  49. // 判断不是头的情况 如果是fill 的情况 这里会==null 所以用not true
  50. if (BooleanUtils.isNotTrue(context.getHead())) {
  51. // 第一个单元格
  52. // 只要不是头 一定会有数据 当然fill的情况 可能要context.getCellDataList() ,这个需要看模板,因为一个单元格会有多个 WriteCellData
  53. WriteCellData<?> cellData = context.getFirstCellData();
  54. // 这里需要去cellData 获取样式
  55. // 很重要的一个原因是 WriteCellStyle 和 dataFormatData绑定的 简单的说 比如你加了 DateTimeFormat
  56. // ,已经将writeCellStyle里面的dataFormatData 改了 如果你自己new了一个WriteCellStyle,可能注解的样式就失效了
  57. // 然后 getOrCreateStyle 用于返回一个样式,如果为空,则创建一个后返回
  58. WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
  59. writeCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
  60. // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
  61. writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
  62. // 这样样式就设置好了 后面有个FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到 cell里面去 所以可以不用管了
  63. }
  64. }
  65. }).sheet("模板")
  66. .doWrite(data());
  67. // 方法3: 使用poi的样式完全自己写 不推荐
  68. // @since 3.0.0-beta2
  69. // 坑1:style里面有dataformat 用来格式化数据的 所以自己设置可能导致格式化注解不生效
  70. // 坑2:不要一直去创建style 记得缓存起来 最多创建6W个就挂了
  71. fileName = TestFileUtil.getPath() + "handlerStyleWrite" + System.currentTimeMillis() + ".xlsx";
  72. EasyExcel.write(fileName, DemoData.class)
  73. .registerWriteHandler(new CellWriteHandler() {
  74. @Override
  75. public void afterCellDispose(CellWriteHandlerContext context) {
  76. // 当前事件会在 数据设置到poi的cell里面才会回调
  77. // 判断不是头的情况 如果是fill 的情况 这里会==null 所以用not true
  78. if (BooleanUtils.isNotTrue(context.getHead())) {
  79. Cell cell = context.getCell();
  80. // 拿到poi的workbook
  81. Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
  82. // 这里千万记住 想办法能复用的地方把他缓存起来 一个表格最多创建6W个样式
  83. // 不同单元格尽量传同一个 cellStyle
  84. CellStyle cellStyle = workbook.createCellStyle();
  85. cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
  86. // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
  87. cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  88. cell.setCellStyle(cellStyle);
  89. // 由于这里没有指定dataformat 最后展示的数据 格式可能会不太正确
  90. // 这里要把 WriteCellData的样式清空, 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到
  91. // cell里面去 会导致自己设置的不一样
  92. context.getFirstCellData().setWriteCellStyle(null);
  93. }
  94. }
  95. }).sheet("模板")
  96. .doWrite(data());
  97. }

我自己写的拦截器样式代码

  1. package com.tj.demo.utils.easyExcel;
  2. import com.alibaba.excel.write.metadata.style.WriteCellStyle;
  3. import com.alibaba.excel.write.metadata.style.WriteFont;
  4. import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
  5. /**
  6. * EasyExcel的样式设置
  7. */
  8. public abstract class TjEasyExcelCellStyleUtils {
  9. /**
  10. * HorizontalCellStyleStrategy (按行设置样式)每一行的样式都一样 或者隔行一样
  11. *
  12. * @return
  13. */
  14. public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() {
  15. // 表头的策略
  16. WriteCellStyle headWriteCellStyle = new WriteCellStyle();
  17. // 背景设置为AUTOMATIC
  18. // headWriteCellStyle.setFillForegroundColor(IndexedColors.AUTOMATIC.getIndex());
  19. // 表头的字体设置
  20. WriteFont headWriteFont = new WriteFont();
  21. headWriteFont.setFontHeightInPoints((short) 11);
  22. headWriteCellStyle.setWriteFont(headWriteFont);
  23. // 内容的策略
  24. WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
  25. // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
  26. //contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
  27. // 背景绿色
  28. //contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
  29. WriteFont contentWriteFont = new WriteFont();
  30. // 字体大小
  31. contentWriteFont.setFontHeightInPoints((short) 11);
  32. contentWriteCellStyle.setWriteFont(contentWriteFont);
  33. // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
  34. return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
  35. }
  36. }