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

内容纲要

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

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

d9e8afe9eb7658896f080dbfed10044c

标签