Batik处理svg图片导致poi导出Excel无法打开文件
简介
最近一周生产环境上导出电子表格文件出现了异常,并不确定是什么原因导致的排查也没有结果。
问题现象
1、正常运行的生产环境,poi导出电子表格没有问题,最近一周出现异常。可以导出,但是Office的 Excel打不开文件。换wps能够打开。
2、导出并不是由浏览器直接打开新的下载窗口进行,而是由vue去解析了文件流,然后通过文件流去写文件。
3、response.setContentType(“application/octet-stream; charset=utf-8”);指定了流。
var filename = decodeURI(file.headers['content-disposition'].split('filename=')[1]);
var blob = new Blob([file.data]);
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, filename);
} else if ('download' in document.createElement('a')) {
var a = document.createElement('a');
a.download = filename;
a.style.display = 'none';
a.href = window.URL.createObjectURL(blob);
document.body.appendChild(a);
a.click();
a.remove();
window.URL.revokeObjectURL(window.URL.createObjectURL(blob));
}
问题排查及解决
1、期间poi的jar包升级了一次版本。怀疑是poi版本问题导致下载后无法打开
还原poi版本,重新测试发现本机可以测试通过,通过本机启动服务下载是可以下载下来并打开的。部署到服务器以后,问题依旧。
排除poi版本问题。怀疑服务器Jenkins集成部署问题。
2、怀疑poi文件流被修改,改用easyExcel。
引入阿里的电子表格工具easyExcel,做一个简单的文件导出功能。点击文件可以打开,但。部署到服务器以后,问题依旧。
easyExcel和poi都是对浏览器返回的文件流进行操作,响应头都是一样的,应该不是工具的问题。
3、怀疑poi和easyExcel同时存在导致文件流出现什么异常
清除了所有相关的easyExcel文件,jar包只用阿里的easyExcel去执行导出,问题依旧。到这里和使用什么工具进行导出是无关的。
4、只能怀疑近期其他功能干扰
近期上线儿 Word文档的导入和导出、word里面视频导入导出、 Svg图片转换为编辑图片。
1、Word文档的导入导出还是借用poi的底层去做 Word文档的导入和导出,怀疑word导出和Excel导出相互影响。
2、和以前上线运行的版本做比较,下线word导出功能。新拉分支删除word导入导出、视频的导入导出相关所有功能,部署代码。问题依旧。
3、和以前上线运行的版本做比较,新拉分支,删除 svg图片转PNG图片的功能,本地运行通过,下载的Excel文件可以打开,部署到生产服务器可以打开,问题解决。
5、开始还原svg图片转PNG图片的功能。
Batik是使用svg格式图片来实现各种功能的应用程序以及Applet提供的一个基于java的工具包。通过Batik,可以在JAVA可以使用的地方操作SVG文档,还可以在你的应用程序使用Batik模块来生成 , 处理和转码SVG图像。还可以直接调用打印机加SUV图片打印出来。
怀疑jar包处理svg图片的时候,影响了Excel的导出。
知道了问题点以后,开始处理这个炸包可能存在的冲突。
安装maybe help组件处理里面存在的冲突问题。
里面确实有冲突,将含有冲突的部分exclude,排除。
通过排除冲突的jar包以后,部署到生产测试不通过。
所以这个jar包可能还有其他的会影响poi,暂时不清楚是哪里的。
6、继续看 batik框架。是否存在拯救的可能?如果不行就换。实在不行的话,换其他处理svg图片的Java组件
继续搜索batik。发现apacate基金会有batik的开源组件,原来是被收编了,收编之后应该会更好,果断替换掉。
通过mavenHelper分析发现里面没有冲突的jar,这次应该能顺利了。
本机编译通过测试通过,发布至服务器测试通过,此问题解决。
总结
已经困扰开发人员几天了,怎么看自己的导出的代码都没有问题,没想到是因为svg图片处理的时候影响了poi。导致下载的Excel文件office打不开。
顺便说一句WPS能代开,Office只能修复后打开,看来国产的进步挺大。不过就是里面的广告太烦人了,还附带好多烦人的软件,还能附带壁纸软件,还能弹窗新闻,除了bye没别的,现在解决了office能打开了,我还是不用WPS。
换阿里的easy Excel,同样的问题也是下载下来打不开,是只能去排查所有的功能点。
功能点排查看到了这一个问题。可用maven helper去解决冲突的问题之后,下载的xlsx打不开,问题还是存在。这就有点不明所以。
最后看到了Apache Foundation维护了batiak。同一家的产品系列应该同时使用应该是没有问题的,这样还是保留系统原有的所有poi的导出,阿里的easyExcel撤下来。
排查自己的代码有时候也解决不了问题,还得看周围的环境,谁知道哪一天会被某一个jar影响了自己的功能的,这事也说不准。