poitl图片处理就是这么简单

543 阅读2分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」

对于图片模版和列表模版相对就简单了,可以参考帮助文档,下边我也只做简单的介绍了

对于文档中的饼状图、柱状图,我是在导入数据的时候,直接根据数据生成了相应的图片,然后保存在文件服务器,并把路径保存到数据库中

图片模版:{{@var}}

图片

{{@var}}

  • 和文本不同的是多了一个@符号,我的office-multip中对图片的定义语法也是@符号,这是不是说明英雄所见略同呢?

  • 关于图片其实和上面文本处理解析是一样的,图片我们可以理解成针对文本的图片化解析,在poi-tl中对应的是PictureRenderData

  • 通过idea的diagrams来看类关系图我们能够发现,之前提到的TextRenderData,HyperLinkTextRenderData都是RenderData的实现类。同样针对图片的处理解析PictureRenderData也是RenderData的实现类之一。后面我们会一一讲解其他的实现类,敬请期待哦

 @Test
 public void pictureTest() throws FileNotFoundException {
   String name = "picture";
   Map<String, Object> map = new HashMap<>();
   // 本地图片
   map.put("local"new PictureRenderData(80100this.getClass().getResource("/local.png").getPath()));
 ​
   // 图片流
   map.put("localbyte"new PictureRenderData(80100".png"this.getClass().getResourceAsStream("/input.png")));
 ​
   // 网络图片(注意网络耗时对系统可能的性能影响)
   map.put("urlpicture"new PictureRenderData(5050".png", BytePictureUtils.getUrlBufferedImage("http://deepoove.com/images/icecream.png")));
 ​
   // java 图片
   map.put("bufferimage"new PictureRenderData(80100".png", ImageUtil.getDefault(50,50,1)));
   init(name,map);
 }
  • 上面通过四种图片形式进行填充,都是经过PictureRenderData处理的。

image-20211130105822218

  • 上面源码表示实际上接受的无非是两种图片,一种是图片路径,这里应该是本地和远程都可以的,另外一种是直接接受图片二进制数据。

  • 该处理方式很简单,需要注意的是图片的大小都需要我们自己控制,和office-multip相比还是有些不足的,在office-multip中我们只需要在模板中设置图片格式就可以了。但是这里需要在代码层面控制,无疑也是工作量的体现。

image-20211130110239316

  • 官网中也明确说明了PictureRenderData是无法处理环绕形式的图片的。作为一个成熟的框架并不会告诉你不行。这里他也提出了解决方案可以通过引用标签来解决,啥叫引用标签先按下不表