hutool poi 基于模板的Excel文件导出(解决: Attempting to write a row already written to disk 问题)

 /**
     * 写Excel文件
     *
     * @param data             数据
     * @param configs          列配置
     * @param destFile         目标文件
     * @param templateFile     模板文件
     * @param onlyAlias        是否仅写出有别名的列
     * @param isWriteKeyAsHead 是否写出标题行
     * @return excel写对象
     */
    private static BigExcelWriter writerExcel(Collection data, List<ExcelColumnConfig> configs, File destFile, File templateFile, boolean onlyAlias, boolean isWriteKeyAsHead, int startRowIndex) {
        BigExcelWriter writer = null;
        if (templateFile != null) {
            //根据模板写数据
            try {
                SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(new XSSFWorkbook(templateFile), -1);
                writer = new BigExcelWriter(sxssfWorkbook, "sheet1");
            } catch (Exception ex) {
                log.error("构造BigExcelWriter异常:", ex);
            }
            log.info("exportExcel templateFile:" + templateFile);
        } else {
            //直接根据目标文件写数据
            writer = new BigExcelWriter(-1);
            log.info("exportExcel destFile:" + destFile);
        }
        //添加列别名
        if (CollUtil.isNotEmpty(configs)) {
            for (ExcelColumnConfig config : configs) {
                writer.addHeaderAlias(config.getOrigin(), config.getAlias());
            }
        }

        //设置起始行
        writer.setCurrentRow(startRowIndex);

        // 只写出加了别名的字段
        writer.setOnlyAlias(onlyAlias);

        // 写入数据
        writer.write(data, isWriteKeyAsHead);

        // 调整列样式(在写入数据后方可调整样式)
        if (CollUtil.isNotEmpty(configs)) {
            //从标题行下一行开始覆写整列单元格样式
            if (isWriteKeyAsHead) {
                startRowIndex++;
            }
            int columnIndex = 0;
            for (ExcelColumnConfig config : configs) {
                //创建新样式
                CellStyle cellStyle = writer.createCellStyle();
                //设置边框
                StyleUtil.setBorder(cellStyle, BorderStyle.THIN, IndexedColors.BLACK);
                //设置对齐方式
                if (config.getHorizontalAlignment() != null) {
                    cellStyle.setAlignment(config.getHorizontalAlignment());
                    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                }
                //设置数据格式
                if (config.getFmt() != null) {
                    cellStyle.setDataFormat(config.getFmt());
                }
                writer.setColumnStyleIfHasData(columnIndex, startRowIndex, cellStyle);

                //列号递增
                columnIndex++;
            }
        }

        //手动设置目标输出文件
        writer.setDestFile(destFile);
        log.info("exportExcel destFile:" + destFile);
        return writer;
    }
@Data
@Accessors(chain = true)
public class ExcelColumnConfig {

    /**
     * 属性名
     */
    private String origin;

    /**
     * 列名
     */
    private String alias;

    /**
     * 水平对齐方式
     */
    private HorizontalAlignment horizontalAlignment;

    /**
     * 数据格式
     *
     * @see BuiltinFormats
     */
    private Short fmt;

    /**
     * 快速创建配置对象
     *
     * @param origin 属性名
     * @param alias  别名
     * @return 新建对象
     */
    public static ExcelColumnConfig makeConfig(String origin, String alias) {
        return new ExcelColumnConfig().setOrigin(origin).setAlias(alias);
    }

    /**
     * 快速创建配置对象
     *
     * @param origin              属性名
     * @param alias               别名
     * @param horizontalAlignment 水平对齐方式
     * @return 新建对象
     */
    public static ExcelColumnConfig makeConfig(String origin, String alias, HorizontalAlignment horizontalAlignment) {
        return new ExcelColumnConfig().setOrigin(origin).setAlias(alias).setHorizontalAlignment(horizontalAlignment);
    }

}

 

posted @ 2022-12-08 16:37  追极  阅读(531)  评论(0编辑  收藏  举报