为何zip压缩包解压后的相同文件会出现字节数组不一致问题?
问题根因
你用Assertions.assertArrayEquals对比XLSX全量字节的校验方式本身不适用于该场景,出现字节不一致但内容正常的核心原因有3个:
- XLSX内置动态元数据:XLSX本质是封装了多份XML文件的ZIP格式包,除了存储表格内容的核心XML外,还包含
docProps/core.xml、docProps/app.xml等元数据文件,每次生成时会自动写入当前时间戳、随机生成的文档唯一ID、默认创建者信息等动态内容,这些内容不会影响表格的展示和实际数据,但是会直接改变整个XLSX文件的字节序列。 - Apache POI的非固定输出逻辑:部分版本的
apache-poi在生成XLSX时,会动态生成内部资源的关联ID、临时辅助属性,这类字段属于格式内部的辅助配置,不影响业务数据,也会造成字节差异。 - 压缩参数未固定:如果代码生成XLSX、或者将XLSX打包到最终交付ZIP包时,没有固定压缩级别、文件修改时间等参数,也会导致最终输出的文件字节出现差异。
可行的校验方案
放弃全字节对比的思路,改用和业务数据强相关的校验方式:
- 调用
apache-poi接口分别读取两份XLSX文件的所有工作表,逐行逐单元格对比单元格值、格式、公式等业务属性,完全匹配则视为转换正确 - 如果需要做字节级对比,可以将XLSX文件本身解压,排除元数据相关的动态文件,仅对比存储表格内容的核心文件(如
xl/worksheets/sheet*.xml、xl/sharedStrings.xml等)的字节
内容的提问来源于stack exchange,提问作者Johanna Egger
相关产品推荐
相关产品推荐

