起因:想要把List<String>类型的数据填充进word表格中,并且可根据列来动态扩展表格的行数
引入依赖
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.4</version>
</dependency>
这里引入的版本事1.10.x,不同的版本代码写法也会有所差别,具体可详见官网
示例:
public static void main(String[] args) throws IOException {
String str1 = "文章包括各种文体的著作、作品,如诗歌、戏剧、小说、科学论文,记叙文、议论文、说明文、应用文等等";
String str2 = "“千古文章未尽才”、“文章千古事”、“文章憎命达”、“板凳要坐十年冷、文章不写一字空”、“积句而成章、积章而成篇”、“言出为论";
String str3 = "下笔成章”等、都是现在所说的文章的意思、更广义的文章、"+""+"、“奥秘”等意思、如“洞明世事皆学问、人情练达即文章”、''";
Map<String,String> stringMap1 = new HashMap<>();
stringMap1.put("index",str1);
stringMap1.put("index1",str2);
stringMap1.put("index2",str3);
List<String> key = new ArrayList<>();
key.add("index");
key.add("index1");
key.add("index2");
//所有字符串的长度是固定的,只取其一就可,获取长度
int length = str1.split("、").length;
//模板替换
replay(key,stringMap1,length);
}
public static void replay(List<String> keys,Map<String,String> params,int length) throws IOException{
List<Map<String,Object>> list = new ArrayList<>();
for (int i = 0;i <= length - 1;i++){
Map<String,Object> map = new HashMap<>();
//将不同key的同样位置的元素取出封装成一个map
for (String key : keys){
String[] split = params.get(key).split("、");
map.put(key,split[i]);
}
//将map封装成list
list.add(map);
}
//将数据再次封装为list
Map<String,Object> data = new HashMap<>();
data.put("var",list);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();//创建一个列表的规则
Configure config = Configure.builder().bind("var", policy).build();
//模板替换
XWPFTemplate template = XWPFTemplate.compile("D:/chsu/test.docx",config)
.render(data);
//输出文件
FileOutputStream replace = new FileOutputStream("D:/chsu/test5.docx");
template.write(replace);
template.getConfig();
replace.flush();
template.close();
}
模板配置:
结果数据样式:
这里的业务里面,数组的长度是固定的,如果遇到多个数组长度不固定,这里提供两种解决思路
1 可以将所有的数组长度调整为一致,就是补空字符串
2 通过比较找到长度最大的那个数组,但在循环时要注意判空