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-区块对
官方文档中存在三种情况:
- False或空集合
- 非False且不是集合
- 非空集合 - 对应情况

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中插入附件的情况不知怎么处理,有大佬会的话欢迎留言