JavaPOI根据模板导出word,POI转化word为html代码
Java POI导出word模板,POI转化word为html代码
需求起因
做项⽬的时候按照客户需求在系统上填写⼀些数据,这些数据最后要导出为word⽂档存档,⽂档有严格的样式,主要是表格构成。参考相关代码后github上到了⼀个POI操作word并导出的开源项⽬,github地址。话不多说看结果。
源⽂档
模板⽂档
对照源⽂档修改⾃⼰的模板,后⾯会详细介绍模板的构造。
系通填写界⾯
最终导出的⽂档
具体实现
⾸先这功能分三部分,1.要导出的模板,2.代码 获取数据,对数据封装,填充到模板⽂件。3.导出要下载的⽂档。
1.要导出的模板
拿到源⽂档后,到要改变的地⽅,这⾥拿⼀个测试⽂档test.docx举例。⽐如说我们要导出各个地区的⽓象数据,每个地区都可以导出,这时候就可以抽出⼀个模板来(有做过短信模板的这⾥⼀⽬了然,⼀模⼀样)。
这个⽂档⾥红⾊的部分要改成可变的,可能是浙江省,江苏省等其他省份信息,这时候抽取要改变的地⽅⽤双⼤括号加变量名代替。eg: {{value}}。
这份⽂档就可以改为如下样式
2.代码实现
这⾥⽤的是spring boot框架,maven管理依赖包,⾸先导⼊需要的依赖包
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.5.0</version>
</dependency>
下⾯是核⼼的代码
@RequestMapping("/word")
@ResponseBody
public ResultJson uploadImg() {
Map<String, Object> data = new HashMap<>();//通过map存放要填充的数据
data.put("province","浙江省");//把每项数据写进map,key的命名要与word⾥⾯的⼀样java修改html文件
data.put("temp",27.8);
data.put("shidu",33.3);
data.put("water",220);
data.put("windir","西北风");
data.put("winforce","7-8");
data.put("chuanyi","天⽓热,适合T恤短裤");
data.put("chuxing","太阳光强,宜做好防晒");
data.put("advice1","适合海边游玩降温");
data.put("advice2","适合洗车");
data.put("advice3","不宜长时间吹空调");
data.put("date", CurDate());
XWPFTemplate template = XWPFTemplatepile("D:\\test.docx").render(data);//调⽤模板,填充数据
try {
FileOutputStream out = new FileOutputStream("D:\\天⽓预报.docx");//要导出的⽂件名
template.write(out);
out.flush();
out.close();
template.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
代码⾮常简单,就⼀个map搞定,这⾥我只是在controller⾥⾯随便测试的,真正要⽤当然要把这些字段放到实体来然后通过反向映射解析对象,循环填充。
⽤postman请求⼀下,看⼀下导出的效果。
以上就是全部过程,如果要下载直接通过response把数据流返给前端就OK了。
原本到这⾥就结束了,但是⽤户有来了⼀个需求,需要预览⽂档,这⾥⼤家就会说了,直接转成json扔给前端处理就好了。如果说⽂档规则的话其实前端通过table很简单就画出来了,就怕样式很复杂,画起来⾮常⿇烦。这⾥在提供⼀个直接将word转为html代码的⽅法。(做后端的我就是这么⼼疼前端)
引⼊依赖包
<!--poi转化-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.verter.xhtml</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.3</version>
</dependency>
好像包有点多。。。。。。。。。
实现代码
try {
InputStream in = new FileInputStream(new File("D:\\天⽓预报.docx"));//要转化的word
XWPFDocument document = new XWPFDocument(in);
OutputStream baos = new ByteArrayOutputStream();
XHTMLConverter xhtmlConverter = (XHTMLConverter) Instance();
String content = String();//转化好的html代码
baos.close();
urnRightObj(content);
} catch (IOException e) {
e.printStackTrace();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。