Freemarker模板生成Excel插入图片的两种方式

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"即可解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值