【java应知】apache poi excel和byte数组转换问题导致写入文件损坏
- 2026-11-06 02:11:10
【java应知】apache poi excel和byte数组转换问题导致写入文件损坏

代码 25行写入后打开文件时会提示文件损坏 27行是正确写法 如果觉得文章内容不错,免费点个赞、推荐、分享一下,如果想第一时间收到推送,可以星标⭐下。更多精选干货,可以点击下方卡片进行查阅! 如果有技术问题,可以在文章底部留言 
点赞 推荐 分享
点击蓝字 关注我

背景
你是否遇到过HSSFWorkbook对象的getBytes()方法得到的byte数组内容不完整而导致写入文件损坏;如下图:

下边给出解决方式。
package com.dragon7531.bdemo.stream.test;import com.alibaba.nacos.client.naming.utils.IoUtils;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import java.io.*;public class ByteTest {public static void main(String[] args) {try (FileInputStream fi = new FileInputStream(new File("/Users/long/software/code/111.xls"));HSSFWorkbook wb = new HSSFWorkbook(fi);) {Sheet sheetAt = wb.getSheetAt(0);Row row = sheetAt.createRow(1);Cell cell = row.createCell((0));cell.setCellValue("新加的值");ByteArrayOutputStream bo = new ByteArrayOutputStream();wb.write(bo);// 刷新并关闭流,确保所有数据都被写入bo.flush();//此行写入会提示文件损坏//ByteArrayInputStream in=new ByteArrayInputStream(wb.getBytes());//此行是正确写法ByteArrayInputStream in = new ByteArrayInputStream(bo.toByteArray());FileOutputStream fo = new FileOutputStream("/Users/long/software/code/222.xls");IoUtils.copy(in, fo);} catch (Exception e) {e.printStackTrace();}}}
总结
HSSFWorkbook 的 getBytes() 方法内容不全的核心原因和解决方案可总结为:
1. 核心原因:方法设计的本质问题getBytes() 方法并非为完整导出Workbook 内容设计,它的底层实现是直接将 Workbook 的内部数据结构序列化,而非按照 Excel 文件格式完整写入字节流。
该方法会跳过 Excel 文件格式的一些关键结构(如文件头、索引表、数据流结束标记等)
只序列化了 Workbook 的部分核心数据,导致生成的 byte 数组天然不完整
2. 最佳实践:必须使用 workbook.write(OutputStream) 方法将 Workbook 写入 ByteArrayOutputStream,再通过 toByteArray() 获取完整字节数组;
视频演示地址
https://www.bilibili.com/video/BV1xB4y177aq

本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。