解决java使用easyexcel填充模版后,高度不一致问题

发布于:2025-04-13 ⋅ 阅读:(40) ⋅ 点赞:(0)

自定义工具,可以通过获取上一行行高设置后面所以行的高度

package org.springblade.modules.api.utils;

import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Row;

public class CustomRowHeightHandler implements RowWriteHandler {

    private int rowHeight;

    public CustomRowHeightHandler(int rowHeight) {
        this.rowHeight = rowHeight;
    }

    @Override
    public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer integer, Integer integer1, Boolean aBoolean) {

    }

    @Override
    public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {

        row.setHeight((short)rowHeight);
    }

    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {

    }
}

导出的代码

/**
     * excel填充模版用
     *
     * @param response         响应
     * @param templateFilePath 模版路径
     * @param inputFileName    导出文件名
     * @param List             数据列表
     * @param map              单个对象
     * @param sheetAt          第几个sheet
     * @param row              获取第几行的高度
     * @throws Exception
     */
    public static void exportExcelByFillIn(HttpServletResponse response, String templateFilePath, String inputFileName,
                                           List<?> List, Map<String, Object> map, Integer sheetAt, Integer row) throws Exception {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileNamePath = URLEncoder.encode(inputFileName, "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileNamePath + ".xlsx");
       
        int rowHeight = getFourthRowHeightFromTemplate(templateFilePath, sheetAt, row);
        InputStream is = getInputStream(templateFilePath);
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(is)
                //从指定行后使设置行高
                .registerWriteHandler(new CustomRowHeightHandler(rowHeight))
                .excelType(ExcelTypeEnum.XLS)
                .build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
        // 填充列表数据
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        excelWriter.fill(List, fillConfig, writeSheet);
        // 填充map中的变量
        excelWriter.fill(map, writeSheet);
        excelWriter.finish();

    }

    /**
     * 获取上一行高度
     *
     * @param templateFilePath
     * @param sheetAt
     * @param row
     * @return
     * @throws Exception
     */
    public static int getFourthRowHeightFromTemplate(String templateFilePath, Integer sheetAt, Integer row) throws Exception {
        InputStream is = getInputStream(templateFilePath);
        Workbook workbook = WorkbookFactory.create(is);
        Sheet sheet = workbook.getSheetAt(sheetAt); // 第几个工作表
        Row fourthRow = sheet.getRow(row); // 第几行(索引从0开始)
        int rowHeight = fourthRow.getHeight();
        workbook.close();
        return rowHeight;
    }

    /**
     * 获取流
     *
     * @param templateFilePath
     * @return
     * @throws Exception
     */
    public static InputStream getInputStream(String templateFilePath) throws Exception {
        ClassPathResource res = new ClassPathResource(templateFilePath);
        InputStream is = res.getInputStream();
        return is;
    }

网站公告

今日签到

点亮在社区的每一天
去签到