使用Java Mail发送ByteArray生成的Excel附件为空问题排查
问题解决:Javax Mail发送生成的Excel附件为空
导致附件内容为空的核心原因是DeferredSXSSFWorkbook的延迟写入特性未被正确触发,以及可能的格式不匹配问题,以下是具体修正步骤:
1. 修正Excel生成代码,确保内容完全写入流
DeferredSXSSFWorkbook是POI针对大数据量的延迟写入实现,仅调用workbook.write(fileOut)无法保证所有内容都被输出,必须手动关闭workbook触发最终写入,同时清理临时资源:
public ByteArrayOutputStream buildexcelreport(){ DeferredSXSSFWorkbook workbook = new DeferredSXSSFWorkbook(); DeferredSXSSFSheet sheet = workbook.createSheet("test"); /* 构建Excel的代码:务必确认这里创建了行、单元格并写入实际内容 */ ByteArrayOutputStream fileOut = new ByteArrayOutputStream(); try { workbook.write(fileOut); // 关键步骤:关闭workbook,触发所有延迟内容写入流 workbook.close(); fileOut.flush(); } catch (Exception e) { e.printStackTrace(); return null; } finally { // 清理DeferredSXSSFWorkbook的临时文件 workbook.dispose(); } return fileOut; }
2. 修正邮件附件的MIME类型与文件扩展名
DeferredSXSSFWorkbook生成的是Office Open XML格式的Excel(.xlsx),而非旧版的二进制格式(.xls),因此需要匹配正确的MIME类型和文件名:
public boolean sendMail(ByteArrayOutputStream fileout) throws IOException { // 构建邮件的其他代码 MimeBodyPart attachmentPart = new MimeBodyPart(); // 替换为xlsx对应的MIME类型 ByteArrayDataSource ds = new ByteArrayDataSource(fileout.toByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); attachmentPart.setDataHandler(new DataHandler(ds)); // 文件名改为.xlsx attachmentPart.setFileName("Report.xlsx"); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); multipart.addBodyPart(attachmentPart); message.setContent(multipart); Transport.send(message); return true; }
3. 额外检查项
- 确认
/* 构建Excel的代码 */部分确实创建了Row和Cell并设置了有效值,比如:DeferredSXSSFRow row = sheet.createRow(0); DeferredSXSSFCell cell = row.createCell(0); cell.setCellValue("测试内容"); - 如果仍有问题,可在build方法返回前,通过
fileOut.size()检查流的字节数,若为0则说明Excel生成逻辑存在问题。
内容的提问来源于stack exchange,提问作者Ananya
相关产品推荐
相关产品推荐

