java使用 poi-tl 导出图片

460 阅读2分钟

poi-tl 导出

图片

word导出的过程中经常会遇到图片的导出情况,之前我在工作中就遇到过一个功能需求,需要在一个文档中多个章节中添加图片实例。
pot-tl 导出图片的方式有以下几种:
1、文件流的形式
2、本地文件路径
3、网络文件路径

需要注意的是这三种方式在word模板文档中的写法是一样的,只是在后端java代码插入的方式不同。
word文档中插入图片的写法:

image.png

写法就是:@ 符号后面加对应图片对象的名称。

1、文件流

使用文件流向文档中插入图片,首先需要把图片加载到 io 流中,然年使用 poi-tl 提供的对象赋值给模板中对应占位符,下面是具体的实现代码。

XWPFTemplate template = XWPFTemplate.compile("D:\template.docx").render(
        new HashMap<String, Object>(){{
            // 流图片
            put("dateImg", Pictures.ofStream(new FileInputStream("dateImg.jpeg"), PictureType.JPEG)
            // java 字节流图片
            put("bufferedImg", Pictures.ofBufferedImage(bufferImage, PictureType.PNG)
        }});
try {
    template.writeAndClose(new FileOutputStream("D:\out.docx"));
}catch (Exception e){
    e.printStackTrace();
}

这里需要注意的是指定图片的类型,在工作中使用该方法的情况较少

2、本地图片的路径

使用本地图片插入的方式就很简单了,而且在工作中经常使用的方式,比较便捷只需要把本地图片的路径包装好,然后使用模板的图片语法就可以向文档中插入图片,具体的代码如下:

XWPFTemplate template = XWPFTemplate.compile("D:\template.docx").render(
        new HashMap<String, Object>(){{
            put("dateImg", "D:\dateImg.jpg");
        }});
try {
    template.writeAndClose(new FileOutputStream("D:\out.docx"));
}catch (Exception e){
    e.printStackTrace();
}

这样的方式是最便捷的,也是我比较推荐的。

3、网络文件路径

网络文件路径的方式和本地文件路径导出的方式一致,只是把本地的文件路径改成网络的路径,比如以下这样:

XWPFTemplate template = XWPFTemplate.compile("D:\template.docx").render(
        new HashMap<String, Object>(){{
            put("dateImg", "https://dss3.bdstatic.com/lPoZeXSm1A5BphGlnYG/skin/74.jpg?2");
        }});
try {
    template.writeAndClose(new FileOutputStream("D:\out.docx"));
}catch (Exception e){
    e.printStackTrace();
}

这里需要注意的是,如果使用网络路径,如果网络不理想的情况下,图片又比较大,那么这个过程就会占用不少的时间,总体来说还是建议使用 本地文件 路径的方式进行导出图片文件。