EasyExcel导出没有序号问题解决

675 阅读1分钟

一、背景

在使用 EasyExcel 进行数据导出时,默认情况下生成的 Excel 文件可能没有序号列。为了满足业务需求,如方便数据查看、排序和索引等,需要一种方法在导出的 Excel 中自动添加序号列。AddNoHandler 类便是为此目的而创建的自定义处理器,用于在 EasyExcel 导出过程中添加序号并处理相关样式和列位置调整。

二、AddNoHandler 类功能概述

AddNoHandler 类实现了 RowWriteHandler 接口,该接口提供了在 Excel 行写入过程中的不同阶段进行自定义操作的方法。通过实现这些方法,AddNoHandler 能够在创建行之前为序号列预留位置,在行创建后添加序号值,并在行处理完成后统一序号列的样式,从而实现为导出的 Excel 文件添加完整且样式一致的序号列功能。

public class AddNoHandler implements RowWriteHandler {

private boolean init = true;

@Override
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                            Integer rowIndex, Integer relativeRowIndex, Boolean isHead) {
    if (init) {
        // 修改存储头部及对应字段信息的 map, 将其中的内容均右移一位, 给新增的序列号预留为第一列
        ExcelWriteHeadProperty excelWriteHeadProperty = writeSheetHolder.excelWriteHeadProperty();
        Map<Integer, Head> headMap = excelWriteHeadProperty.getHeadMap();
        int size = headMap.size();
        for (int current = size; current > 0; current--) {
            int previous = current - 1;
            headMap.put(current, headMap.get(previous));
        }
        // 空出第一列
        headMap.remove(0);
        // 只需要修改一次 map 即可, 故使用 init 变量进行控制
        init = false;
    }
}

@Override
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                           Integer relativeRowIndex, Boolean isHead) {
    // 在行创建完成后添加序号列
    Cell cell = row.createCell(0);
    int rowNum = row.getRowNum();
    if (rowNum == 0) {
        cell.setCellValue("序号");
    } else {
        cell.setCellValue(rowNum);
    }
}

@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                            Integer relativeRowIndex, Boolean isHead) {
    if (row.getLastCellNum() > 1) {
        // 将自定义新增的序号列的样式设置与默认的样式一致
        row.getCell(0).setCellStyle(row.getCell(1).getCellStyle());
    }
}

}