之前导出word都会选择使用xml来编写模板,用freemarker渲染,但是这种方式,不支持docx,会丢失页眉页脚和其他的样式等。
我们选择poi-tl,但是他的图片标签是一个字段对应一张图片,我们扩展一个字段多张图片显示处理。
首先增加依赖,这个对poi的版本有要求,请阅读官方文档。
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.9.1</version>
</dependency>
自定义一个渲染器,我们这里需要的数据是一个图片集合,数据格式还是用框架自带的。
/**
* @author yanpeng
* @version 1.0
* @desc 多图片组件
* @company 北京中经网软件有限公司
* @date 2021/3/31 15:17
*/
public class MultiImageRenderPolicy extends AbstractRenderPolicy<List<PictureRenderData>> {
@Override
public void doRender(RenderContext<List<PictureRenderData>> context) throws Exception {
WhereDelegate where = context.getWhereDelegate();
Object o = context.getThing();
if(o instanceof List){
List<PictureRenderData> picList = context.getThing();
if(picList != null && picList.size() != 0){
for(PictureRenderData x: picList){
InputStream stream = null;
try {
stream = new ByteArrayInputStream(x.getImage());
where.addPicture(stream, x.getPictureType().type(), x.getWidth(), x.getHeight());
} finally {
IOUtils.closeQuietly(stream);
}
}
}
}
}
@Override
protected void afterRender(RenderContext<List<PictureRenderData>> context) {
// 清空标签
clearPlaceholder(context, true);
}
}
用下面代码绑定标签与渲染器,我们将%与我们自己定义的渲染解析器进行绑定。
Configure configure = configureBuilder.addPlugin('%', new MultiImageRenderPolicy())
.useSpringEL(false).build();
如下图,最后如果用户上传多个照片,这里就一个标签会显示多个图片