poi-tl一个字段多张图片显示处理

头像
码农笔录
2021-04-19 后端 阅读量 1652

之前导出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();

如下图,最后如果用户上传多个照片,这里就一个标签会显示多个图片

image.png