ApachePOI 不定数量图片

POI-TL

官方文档:http://deepoove.com/poi-tl

1. 不定数量图片

生成word时,同时生成不定数量的图片

方式一:区块对

此方法适用于poi-tl 1.7.X版本以上

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.7.3</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>

参考 5.便签 中的5.5区块对描述:sections - 为你自定义的标签名称

区块对由前后两个标签组成,开始标签以?标识,结束标签以/标识{{?sections}}{{/sections}}

poi-tl-区块对

官方文档中存在三种情况:

  1. False或空集合
  2. 非False且不是集合
  3. 非空集合 - 对应情况
poi-tl

此时=号用来表示输出文本,我们需要输出图片即将=号修改为@号即可

示例代码

public class PoitlTest {

    public static void main(String[] args) throws IOException {
        /************************** START *************************/
        final List<PictureRenderData> images = new ArrayList<PictureRenderData>();
        images.add(new PictureRenderData(500, 300, "图片位置"));
        images.add(new PictureRenderData(500, 300, "图片位置"));
        images.add(new PictureRenderData(500, 300, "图片位置"));
        images.add(new PictureRenderData(500, 300, "图片位置"));
        /************************** END *************************/
        XWPFTemplate template = XWPFTemplate.compile("D:\\StudyFile\\Project\\problem.docx").render(
            new HashMap<String, Object>() { 
                {
                put("images", images);
                } 
            });
        FileOutputStream out = new FileOutputStream("output.docx");
        BufferedOutputStream bos = new BufferedOutputStream(out);
        template.write(out);
        bos.flush();
        bos.close();
        out.flush();
        out.close();
    }
}

生成word时,同时生成不定数量的图片

方式二:嵌套/文档模版

此方法适用于poi-tl 1.4.X版本以上

参考 5.便签 中的5.5区块对描述:sections - 为你自定义的标签名称

嵌套又称为导入、包含或者合并,以+标识:{{+var}}

代码示例:

List<SegmentData> subData = new ArrayList<SegmentData>();
SegmentData s1 = new SegmentData();
s1.setTitle("经常抱怨的自己");
s1.setContent("每个人生活得都不容易。");
subData.add(s1);

SegmentData s2 = new SegmentData();
s2.setTitle("拖拖拉拉的自己");
s2.setContent("能够今天做完的事情,不要拖到明天?");
subData.add(s2);

put("docx_word", new DocxRenderData(new File("~/segment.docx"), subData));  
主模板包含嵌套标签{{+docx_word}}
segment.docx是一个包含了{{title}}和{{content}}的子模板,使用subData集合渲染后合并到主模板

此处的SegmentData为自定义类(POJO),定义属性以及Getter/Setter

eg:图片类

public class ImageData {
    // 存储图片对象 - 对应子模板标签名称
    private PictureRenderData image;

    public PictureRenderData getImage() {
        return image;
    }

    public void setImage(PictureRenderData image) {
        this.image = image;
    }
}
@Test
public void poitest() throws IOException {
    final List<ImageData> segments = new ArrayList<ImageData>();
    ImageData s1 = new ImageData();
    s1.setImage(new PictureRenderData(500, 300, "文件路径"));
    segments.add(s1);

    ImageData s2 = new ImageData();
    s2.setImage(new PictureRenderData(500, 300, "文件路径"));
    segments.add(s2);

    XWPFTemplate template = XWPFTemplate.compile("主模板路径").render(
        new HashMap<String, Object>() {
            {
            // 此处docx_word 对应 主模板{{+docx_word}}
            // 子模版标签为图片 {{@image}}
            put("docx_word", new DocxRenderData(new File("子模版路径"), segments));
            }
        });
    FileOutputStream out = new FileOutputStream("output.docx");
    BufferedOutputStream bos = new BufferedOutputStream(out);
    template.write(out);
    bos.flush();
    bos.close();
    out.flush();
    out.close();
}

word中插入附件的情况不知怎么处理,有大佬会的话欢迎留言

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容