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);
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章