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); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库