Spring Boot中Apache POI生成的.xlsb文件无法打开求助
在Spring Boot中使用Apache POI生成有效.xlsb文件的解决方案
问题分析
生成的.xlsb文件无法被Excel打开,提示格式或扩展名无效,核心原因通常是生成的文件实际格式与扩展名不匹配,或者Workbook实例未正确配置为XLSB类型。
解决步骤
1. 确保依赖正确
使用Apache POI处理.xlsb需要依赖poi-ooxml,推荐使用5.x及以上稳定版本,对XLSB支持更完善:
<!-- Maven依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency>
2. 创建XLSB类型的Workbook
必须显式将Workbook的文档类型设置为XLSB,否则默认生成的是XLSX格式文件,即使扩展名是.xlsb也无法被Excel识别:
// 创建XLSB格式的Workbook实例 XSSFWorkbook workbook = new XSSFWorkbook(); // 关键:设置文档类型为XLSB workbook.setDocumentType(XSSFWorkbookType.XLSB); // 示例:添加工作表和数据 XSSFSheet sheet = workbook.createSheet("使用报表"); XSSFRow headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("日期"); headerRow.createCell(1).setCellValue("使用量"); // 填充数据行 XSSFRow dataRow = sheet.createRow(1); dataRow.createCell(0).setCellValue("2021-07-01"); dataRow.createCell(1).setCellValue(100);
3. 正确写入并关闭文件
使用try-with-resources语法自动管理流资源,避免因流未正确关闭导致文件损坏:
String fileName = fromDate.replace("-", "").substring(0, 6) + "-usagereportb.xlsb"; String filePath = "D:\\java\\rating-report\\usage_report_v1\\" + fileName; try (FileOutputStream outputStream = new FileOutputStream(filePath)) { workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { workbook.close(); } catch (IOException e) { e.printStackTrace(); } }
常见错误排查
- 未设置XLSB文档类型:这是最常见的原因,默认
XSSFWorkbook生成的是XLSX格式,必须通过setDocumentType(XSSFWorkbookType.XLSB)切换为二进制格式。 - 依赖版本过低:旧版本POI对XLSB的支持存在bug,升级到5.x版本可解决大部分兼容性问题。
- 流未正确关闭:手动关闭流时如果出现异常,可能导致文件写入不完整,使用try-with-resources可避免此问题。
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

