Java + easyexcel 新旧数据对比,单元格值标红

说明:Java + easyexcel 复制excel模版样式及表头,写入新数据,并对比旧数据,数据不一致标红

pom

复制代码
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>4.0.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>5.2.5</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>5.2.5</version>
		</dependency>

数据对比处理器

复制代码
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.example.entity.Equipment;
import org.apache.poi.ss.usermodel.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class CustomValueHandler implements CellWriteHandler {

    private final Map<Integer, Map<Integer, String>> originalValues;

    public CustomValueHandler(List<Equipment> originalList) {
        this.originalValues = new HashMap<>();
        for (int i = 0; i < originalList.size(); i++){
            Map<Integer, String> rowMap = new HashMap<>();
            Equipment item = originalList.get(i);
            rowMap.put(0, item.getEquipCode());
            rowMap.put(1, item.getEquipName());
            rowMap.put(2, item.getEquipRule());
            rowMap.put(3, item.getEquipState());
            rowMap.put(4, item.getEquipNum());
			//我这里的表头是4行,所以序号要加4
            this.originalValues.put(i + 4, rowMap);

        }
    }
    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder,
                                 WriteTableHolder writeTableHolder,
                                 List<WriteCellData<?>> cellDataList,
                                 Cell cell, Head head,
                                 Integer relativeRowIndex,
                                 Boolean isHead) {

        String stringCellValue = cell.getStringCellValue();
        int rowIndex = cell.getRowIndex();
        int columnIndex = cell.getColumnIndex();

        if(originalValues.containsKey(rowIndex)) {

            String original = originalValues.get(rowIndex).get(columnIndex);

            if(original != null && !original.trim().equals(stringCellValue.trim())) {
                Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
                CellStyle originalStyle = cell.getCellStyle();
                CellStyle style = workbook.createCellStyle();
                //复制原有样式属性
                style.cloneStyleFrom(originalStyle);
                Font font = workbook.createFont();
                font.setColor(IndexedColors.RED.getIndex());
                style.setFont(font);
                // 保留原有背景色(不设置背景色)
                cell.setCellStyle(style);
            }
        }
    }
}

excel处理器

复制代码
public class EasyExcelDynamicFilter implements SheetWriteHandler {
    private final int rowIndex;

    public EasyExcelDynamicFilter(int rowIndex) {
        this.rowIndex = rowIndex;
    }

    @Override
    public void afterSheetCreate(SheetWriteHandlerContext context) {
        Sheet sheet = context.getWriteSheetHolder().getSheet();
        // 保留前4行(索引0-3),删除其余行
        for (int i = rowIndex; i <= sheet.getLastRowNum(); i++) {
            if (sheet.getRow(i) != null) {
                sheet.removeRow(sheet.getRow(i));
            }
        }
    }
}

业务处理

复制代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
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 org.apache.poi.ss.usermodel.Cell;
import org.example.handler.DynamicFilter;

import java.io.IOException;
import java.util.List;

public class ExcelHeaderUtil {
    /**
     * 复制模板前4行并清除后续内容
     *
     * @param templatePath 模板路径
     * @param outputPath 输出路径
     * @param originalList 初始数据
     * @param data 新数据
     */
    public static void copyRows(String templatePath,
                                String outputPath,
                                List<Equipment> data, List<Equipment> originalList) throws IOException {

        // 创建样式拦截器
        CellWriteHandler styleHandler = new CellWriteHandler() {
            @Override
            public void afterCellCreate(WriteSheetHolder sheetHolder,
                                        WriteTableHolder tableHolder,
                                        Cell cell, Head head,
                                        Integer relativeRowIndex,
                                        Boolean isHead) {
            }
        };

        // 构建写入器
        ExcelWriter writer = EasyExcel.write(outputPath)
                .withTemplate(templatePath)
                .registerWriteHandler(new EasyExcelDynamicFilter(4))
                .registerWriteHandler(new CustomValueHandler(originalList))
                .registerWriteHandler(styleHandler)
                .build();

        // 触发模板处理
        writer.write(data, EasyExcel.writerSheet().build());
        writer.finish();  // 必须显式关闭
    }
}
相关推荐
3GPP仿真实验室几秒前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
devmoon4 分钟前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
lili-felicity4 分钟前
CANN流水线并行推理与资源调度优化
开发语言·人工智能
爬山算法5 分钟前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
沐知全栈开发5 分钟前
CSS3 边框:全面解析与实战技巧
开发语言
island131415 分钟前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构 Stream 调度机制
c语言·开发语言·神经网络
云姜.17 分钟前
线程和进程的关系
java·linux·jvm
是码龙不是码农19 分钟前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧19 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..20 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范