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