当前位置: 首页 > news >正文

easyexcel指定sheet页动态给行列加背景色

需求

  1、easyexcel,有多个sheet页,某些sheet页的行、列动态需要加背景色。

  2、扩展支持cellStyle标记单元格超过64000

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;import java.util.HashMap;
import java.util.List;
@Slf4j
public class ExcelBackgroudHandler implements CellWriteHandler {
//颜色
private Short colorIndex;//行,以及对应的列,多个列逗号拼接
private HashMap<Integer,String> rowColMap;//保存单元格样式,否则cellStyle被创建超过64000就会报错
Map<String,CellStyle> cellStyleMap = new HashMap<>();
public ExcelBackgroudHandler(Short colorIndex, HashMap<Integer, String> rowColMap) {this.colorIndex = colorIndex;this.rowColMap = rowColMap;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,Head head, Integer relativeRowIndex, Boolean isHead) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,CellData cellData, Cell cell, Head head, Integer relativeRowIndex,Boolean isHead) {}/**** 指定行列加颜色* @param writeSheetHolder* @param writeTableHolder* @param cellDataList* @param cell* @param head* @param relativeRowIndex* @param isHead* @Date: 2023/11/22 17:02**/@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<CellData> cellDataList, Cell cell, Head head,Integer relativeRowIndex, Boolean isHead) {int columIndex = cell.getColumnIndex();int rowIndex = cell.getRowIndex();if (null != rowColMap && rowColMap.get(rowIndex)!=null && rowColMap.get(rowIndex).contains(columIndex+"")) {Sheet sheet = writeSheetHolder.getSheet();Workbook workbook = sheet.getWorkbook();CellStyle cellStyle;String key = colorIndex+"";if(cellStyleMap.get(key )!=null){cellStyle = cellStyleMap.get(key );}else{cellStyle = workbook.createCellStyle();cellStyle.setFillForegroundColor(colorIndex);// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUNDcellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cellStyleMap.put(key ,cellStyle);}cell.setCellStyle(cellStyle );}}}
@Data
public class TestVO {@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "年龄", index = 1)private int age;@ExcelProperty(value = "学校", index = 2)private String school;}

测试类

/*** 测试导出模板* 1. 标题指定某列标红色字段* 2. 标题指定某列加批注*/
public static void main(String[] args) throws FileNotFoundException {String filePahth = "D:\\1.xlsx";// 输出流OutputStream outputStream = new FileOutputStream(new File(filePahth));// 导出的数据List<TestVO> dataList = new ArrayList<>();for(int i=0;i<35000;i++){TestVO testVO = new TestVO();testVO.setAge(11);testVO.setName("测试dd"+i);testVO.setSchool("学校"+i);TestVO testVO1 = new TestVO();testVO1.setAge(111);testVO1.setName("测试1"+i);testVO1.setSchool("学校1"+i);dataList.add(testVO);dataList.add(testVO1);}// 指定批注HashMap<Integer, String> annotationsMap = new HashMap<>();for(int i=0;i<70000;i++){annotationsMap.put(i,"1,2");}ExcelBackgroudHandler excelBackgroudHandler = new ExcelBackgroudHandler(IndexedColors.RED.index,annotationsMap);WriteSheet writeSheet = EasyExcel.writerSheet(1, "测试").registerWriteHandler(excelBackgroudHandler).head(TestVO.class).build();WriteSheet writeSheet2 = EasyExcel.writerSheet(2, "测试2").registerWriteHandler(excelBackgroudHandler).head(TestVO.class).build();ExcelWriter excelWriter = EasyExcel.write(outputStream).build();excelWriter.write(dataList,writeSheet);excelWriter.write(dataList,writeSheet2);excelWriter.finish();//excel追加导出String newFilePath = "D:\\1temp.xlsx";ExcelWriter excelWriter1 = EasyExcel.write(newFilePath).withTemplate(filePahth).build();WriteSheet writeSheet1 = EasyExcel.writerSheet(2, "测试1") .head(TestVO.class).build();excelWriter1.write(dataList,writeSheet1);excelWriter1.finish();File tempFile = new File(newFilePath);if (tempFile.exists()) {File file = new File(filePahth);file.delete();tempFile.renameTo(file);}}

http://www.lryc.cn/news/246924.html

相关文章:

  • 设计模式在实际业务中应用 - 模版方法
  • BGP综合实验
  • Global Surface Summary of the Day 全球逐日气象站点数据 GSOD数据集
  • Harmony OS4开发入门
  • .net core 事务
  • 【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】
  • MPPT工作流程及算法和硬件的选择
  • C#,《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)
  • 每日一练【移动零】
  • QT修改windowTitle的名字以及图片
  • C语言-指针讲解(3)
  • 慢 SQL 分析及优化
  • PTA:计算m到n之间所有素数的和
  • Golang实现YOLO:高性能目标检测算法
  • 文档 + 模型
  • 计算机毕业设计php+bootstrap小区物业管理系统
  • Osg线程模型(选择不当,会引发崩溃)
  • 2161根据数字划分数组
  • Oracle Linux 9.3 发布
  • XML Schema中的simpleContent 元素
  • 线性分类器--分类模型
  • 【开源】基于Vue和SpringBoot的企业项目合同信息系统
  • 指针数组用指针变量模拟二维数组
  • 接口文档自动生成工具:详细教程和实用技巧
  • C语言--不创建第三个变量,实现对两个数字的交换
  • Java中的mysql——面试题+答案(数据库连接池,批处理操作)——第22期
  • 商用车的智慧眼车规级激光雷达
  • 【NI-RIO入门】为CompactRIO供电
  • 【数据结构/C++】栈和队列_链队列
  • C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)