900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 使用poi-tl向word插入图片 文本 表格行循环

使用poi-tl向word插入图片 文本 表格行循环

时间:2019-10-27 18:46:20

相关推荐

使用poi-tl向word插入图片 文本 表格行循环

使用poi-tl向word插入图片、文本、表格行循环

工作中难免会向word中操作数据,本文主要介绍poi-tl的使用,先来看效果图

核心介绍:标签

1、插入文本标签 : {{var}}

2、插入图片标签: {{@var}}

操作步骤:

1、引入依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version><exclusions><exclusion><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId></exclusion></exclusions></dependency><!-- #我在开发时遇到poi 4.1.2版本缺失xmlbeans依赖,于是自行补上--><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.3</version></dependency>

2、Java核心代码

// 关于以下参数datas如何生成,我简单写一个例子,因为大家可以看到开始的图片,我做的时候需要套接的字太多了,// 但不难,大家有多少写多少就ok,主要是将套接字和需要填充的字段连接起来Map<String,Object> datas =new HashMap<>();datas.put("year",year); // 套接普通文本//如果有循环表格怎么办呢,下问题,仔细看Map的value是Object类型,你可以封装一个新的map集合作为valueList<Map<String,Object>> detailList = new ArrayList<>();for(...){Map<String,Object> map =new HashMap<>();map.put("index",i + 1);map.put("code",baseDocument.getCode());detailList.add(map);}datas.put("dataList",detailList); //嵌套循环表格数据,想要得倒循环的效果记得要绑定,见下列readModel函数PictureRenderData pic = getPictureData(inputStream)datas.put("pic1",pic) // 套接图片/*** @Param datas 标签与需要填充的字段* @return void**/public void readModel(Map<String,Object> datas) {// 获取文件模版的输入流 ,也可以使用IO流访问文件具体的路径,InputStream stream = readResult.stream;// 循环行表格锁定函数LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();// 将需要循环的表格的上一列插入{{var}},下面需要循环的数据使用[var]Configure config = Configure.builder().bind("dataList", policy) // 绑定循环行标签,有几个循环行则绑定几个,即绑定{{var}}.bind("picList",policy).bind("arcList",policy).build();XWPFTemplate template = pile(stream,config).render(datas); // 这里的datas是Map<String,Object> 类型,key与模版中的标签一致,value就是想要填充的值try {FileOutputStream out;out = new FileOutputStream("输出路径");// 生成word的输出流template.write(out); out.flush();out.close();byteArrayInputStream.close();template.close();} catch (IOException e) {e.printStackTrace();log.info(e.getMessage());}}/*** 传入图片的输入流获取图片文件* @param inputStream* @return*/public PictureRenderData getPictureData(InputStream inputStream){return new PictureRenderData(80,25,PictureType.JPEG,inputStream);}

官方网址:/poi-tl/

总结

1、准备模版,定义好需要的标签

2、查询模版

3、获取需要填充的字段

4、将需要套接的关键字和需要填充的字段组合成Map<String,Object> datas(其中key为标签,value为需要填充的字段)

5、写入datas并生成新的word

常见问题

1、项目直接报错,没有生成word

可能的原因:

项目构建Map<String,Object> datas 里有空指针异常poi-tl与poi版本冲突,详见官网选择合适的版本

2、已生成新的word文件,但部分数据没有渲染,展示出的是模版字段,例如模版中存在{{var}},导出来还是{{var}}

可能的原因:

标签关键字跟java代码中的key不一致,需要仔细看部分标签的命名有点长,可能存在空格或换行符,将空格或换行符删掉即可。

本文未给出全部代码,但关键性的代码已给出,并作了详细的注释,加上本人所踩的坑一并奉上,希望能帮助到你。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。