1.问题背景
最近项目中遇到一个问题,导出的Excel模板,当初前人是用freemarker模板生成excel导出的,现在项目重构,导出之前需要加上印章。freemarker模板的做法,一般都是先用excel做好模板,另存为2003版本的xml格式,nop++打开,将内容复制到.ftl文件里,格式规整一下,就成了一种变异风格的html页面。当前问题就是加上印章之后,同事把导出的excel发给另外一个同事,excel还在,但是印章不见了。
2.探究原因
我仔细查看了一下同事导出的excel,发现插入印章用的方式,很朴素,img标签里面是src="路径",结果出的路径还是本地路径,那么问题原因很明了。印章的路径指向的是本地路径,excel模板发给别人当然没有印章。
3.解决问题
背景中说了,freemarker模板做的excel,其实语言类似于一种变异的html,那么还有一种方法实现,img标签里不写图片路径,写base64字符串,科学论证法嘛,大胆假设,小心论证。
3.1freemarker模板
<img src="${imageData!}">
模板里面需要印章图片的地方加上这块代码,imageData只是key名,数据双向绑定,方便后端传输,!表示判空.
3.2后端
String picName = “图片名字”;
String imgStr = "";
if (StringUtils.isNotBlank(picName)) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("images/" + picName);
imgStr = convertToBase64(inputStream);
}
dto.setImageData(("data:image/png;base64," + imgStr).replace("==","%3D%3D"));
将印章图片转成base64字符串,塞入对象,传输到前端。导出excel,即可展示印章图片,发送给他人,印章图片也不会丢失。
3.3可能遇到的问题
转成base64字符串过后,前端导出的excel文件大小确实变大了,但是印章依旧没有展示,回头看3.2,将字符串里的"=="replace陈"%3D%3D"即可解决。