官方文档 http://deepoove.com/poi-tl/#_why_poi_tl
区块对和表格行循环
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.0</version>
</dependency>
public static void main(String[] args) throws IOException {
// 替换变量map
Map<String, Object> map = Maps.newHashMap();
ArrayList<User> wtr = new ArrayList<>();
User use1 = User.builder().name("张三").idCard("1111111111").build();
User use2 = User.builder().name("李四").idCard("2222222222").build();
wtr.add(use1);
wtr.add(use2);
ArrayList<User> str = new ArrayList<>();
User use3 = User.builder().name("王五").idCard("1111111111").build();
str.add(use3);
//表格行循环
ArrayList<User> people = new ArrayList<>();
User use4 = User.builder().name("王五").age(20).sex("男").birthday("2022-07-29").idCard("1111111111").build();
people.add(use4);
//所有变量需要放到map中,key为模板中的变量
map.put("wtr", wtr);
map.put("str", str);
map.put("领证人姓名","赵六");
map.put("people",people);
//要替换文件
InputStream templateFileInputStream = new FileInputStream("C:\\Users\\test\\Desktop\\test.docx");
//表格行循环
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure configure = Configure.builder()
.bind("people", policy)
.build();
XWPFTemplate template = XWPFTemplate.compile(templateFileInputStream, configure).render(map);
String docxTemp = "C:\\Users\\test\\Desktop\\测试" + ".docx";
FileOutputStream out = new FileOutputStream(docxTemp);
template.write(out);
out.flush();
}
区块对和spring表达式结合使用
假设现在我需要用顿号将人的名字隔开
例如 张三、李四、王五
模板变量设置 {{?proposer}}{{name}}、{{/proposer}}
public static void test() throws Exception {
Map<String, Object> map = Maps.newHashMap();
List<KerProposerReplaceVO> list = new ArrayList<>();
list.add(KerProposerReplaceVO.builder().name("张三").build());
list.add(KerProposerReplaceVO.builder().name("李四").build());
list.add(KerProposerReplaceVO.builder().name("王五").build());
map.put("proposer", list);
map.put("总人数", 3);
//要替换文件
InputStream templateFileInputStream = new FileInputStream("C:\\Users\\zhl\\Desktop\\test2.docx");
Configure configure = Configure.builder().useSpringEL(true).build();
XWPFTemplate template = XWPFTemplate.compile(templateFileInputStream, configure).render(map);
String docxTemp = "C:\\Users\\zhl\\Desktop\\test23523" + ".docx";
FileOutputStream out = new FileOutputStream(docxTemp);
template.write(out);
out.flush();
IoUtil.close(out);
}
替换效果 张三、李四、王五、
结尾多了一个顿号
修改模板变量设置 {{?proposer}}{{name}}{{_has_next ? ‘、’ : ‘’}}{{/proposer}}
替换效果 张三、李四、王五
特别注意: 如果模板中有标签名是中文 {{总人数}},首先需要修改代码,将useSpringEL(ture) 改为 useSpringEL(false),否则报错
Cannot render docx template, please check the Exception
Caused by: java.lang.IllegalStateException: Cannot handle (24635)
修改后替换结果,少了总人数
需要修改模板变量 {{[‘总人数’]}} 使用 [‘’] 将中文包在中间
修改后替换结果,少了总人数
需要修改模板变量 {{[‘总人数’]}} 使用 [‘’] 将中文包在中间,单引号最好在文本编辑器中打好后复制进docx,否者就变成前面文字显示那样了,正确如下图