EasyExcel模板导出缺少框体和合并样式解决

前言:最近有需求使用easyExcel来完成导出功能,导出后发现丢失了合并的列和单元格样式,最后通过添加处理器解决该问题

1. 模板如下所示

EasyExcel模板导出缺少框体和合并样式解决_第1张图片

代码如下:

EasyExcel模板导出缺少框体和合并样式解决_第2张图片

2. 运行后发现导出模板丢失合并列的样式,如下

缺少了边框和合并合并单元格

EasyExcel模板导出缺少框体和合并样式解决_第3张图片

3. 添加处理器来处理补充丢失的合并和样式

EasyExcel模板导出缺少框体和合并样式解决_第4张图片


 代码如下,核心是通过计算每一个列表的长度然后判断哪些单元格是需要添加样式,然后通过操作sheet完成。

public class DispatchInspectionHandler implements CellWriteHandler {

    private final int data1Length;
    private final int data2Length;
    private final int data3Length;
    private final int data4Length;

    public DispatchInspectionHandler(int data1Length, int data2Length, int data3Length, int data4Length) {
        this.data1Length = data1Length;
        this.data2Length = data2Length;
        this.data3Length = data3Length;
        this.data4Length = data4Length;
    }

    /**
     * Called after the cell data is converted
     *
     * @param context
     */
    @Override
    public void afterCellDataConverted(CellWriteHandlerContext context) {
        Sheet sheet = context.getWriteSheetHolder().getCachedSheet();
        Workbook workbook = context.getWriteSheetHolder().getSheet().getWorkbook();
        // 创建边框样式
        CellStyle borderStyle = workbook.createCellStyle();
        borderStyle.setBorderTop(BorderStyle.THIN);
        borderStyle.setBorderBottom(BorderStyle.THIN);
        borderStyle.setBorderLeft(BorderStyle.THIN);
        borderStyle.setBorderRight(BorderStyle.THIN);

        // 判断并合并B列到F列
        if (data1Length > 1) {
            //判断当前单元格是否在合并区域中
            if (context.getColumnIndex() == 1 && context.getRowIndex() >= 5 && context.getRowIndex() < (5 + data1Length - 1)) {
                //创建合并列
                CellRangeAddress cellAddresses = new CellRangeAddress(context.getRowIndex(), context.getRowIndex(), 1, 5);
                sheet.addMergedRegion(cellAddresses);
                //设置边框
                setRegionBorder(cellAddresses, sheet);

                //合并G
                CellRangeAddress cellAddresses1 = new CellRangeAddress(context.getRowIndex(), context.getRowIndex(), 6, 10);
                sheet.addMergedRegion(cellAddresses1);
                setRegionBorder(cellAddresses1, sheet);
            }
        }
      //……下面代码和上面一样就忽略了
    }
    /**
     * 设置合并单元格的边框
     */
    private void setRegionBorder(CellRangeAddress cellAddresses, Sheet sheet) {
        RegionUtil.setBorderTop(BorderStyle.THIN, cellAddresses, sheet);
        RegionUtil.setBorderBottom(BorderStyle.THIN, cellAddresses, sheet);
        RegionUtil.setBorderLeft(BorderStyle.THIN, cellAddresses, sheet);
        RegionUtil.setBorderRight(BorderStyle.THIN, cellAddresses, sheet);
        }
}

4. 效果完成:

问题解决

EasyExcel模板导出缺少框体和合并样式解决_第5张图片

你可能感兴趣的:(后端,java,excel,spring,boot)