您的当前位置:首页记录一次POI导出word文件的细节问题

记录一次POI导出word文件的细节问题

2021-09-25 来源:小侦探旅游网
记录⼀次POI导出word⽂件的细节问题

⾸先百科⼀下POI是什么:

Apache POI是Apache软件基⾦会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。通过字⾯意思,我们⼤概知道这个API是可以⽤来做 java 导出word 及excel 的。下⾯不废话了,直接总结⼀下,java ⽤模板导出 word 的⽅法。⽬前项⽬中我⽤到的⽅法分为两种(今天先说第⼀种)。

1.使⽤poi读取模板word,然后导出所需要的word。

先说⼀下准备⼯作:

1.1 所需jar 包:这⾥我使⽤的是poi-3.9 jar 包,下⾯上依赖:

org.apache.poi poi-ooxml 3.9

org.apache.poi ooxml-schemas 1.1

1.2 模板⽂件 xxxx.docx

这⾥要说⼀下有⼀个⼩坑,poi-3.9 ⽬前只⽀持读取 .docx 格式的 word,也就是office 2007以后的格式。请⼤家注意使⽤时把 word 模板改为.docx 后缀名。然后就是准备好替换的模板,如下图:

PS:这⾥重点说明⼀下,⼀个问题,就是在输⼊占位符的时候,⼀定⼀定⼀定要是从做到右连续输⼊占位符,不然会被识别为多个⽚段,导致占位符不匹配,困扰了我半天,所以来特此记录⼀下0.0

下⾯直接上代码,注意看步骤:

String path = request.getSession().getServletContext().getRealPath(\"/exceldemo/关于安排2017年市级机关住房解困资⾦的报告.docx\");//获取模板路径

FileInputStream is = new FileInputStream(path);//读⼊流中

XWPFDocument xdf = new XWPFDocument(is);//新建⼀个word⽂档

//变量

Map params = new HashMap();params.put(\"year\params.put(\"month\params.put(\"day\params.put(\"win\

this.replaceText(xdf,params);//替换word中的变量。

这⾥⽤了⼀个⽅法replaceText(),就是替换变量的⽅法,代码如下:/**

* 替换⽂档中的参数(word)

* @param doc * @param params */

private void replaceText(XWPFDocument doc, Map params) { Iterator iterator = doc.getParagraphsIterator(); XWPFParagraph para; while (iterator.hasNext()) { para = iterator.next();

this.replaceInPara(para, params); }} /**

* 替换段落中的参数(word) * @param para * @param params */

private void replaceInPara(XWPFParagraph para, Map params) { List runs; Matcher matcher;

if (matcher(para.getParagraphText()).find()) { runs = para.getRuns();

for (int i=0; iwhile ((matcher = matcher(runText)).find()) {

runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1)))); }

para.removeRun(i);

//重新插⼊run⾥内容格式可能与原来模板的格式不⼀致 para.insertNewRun(i).setText(runText); } } }}

下⾯看看替换后的效果:

因篇幅问题不能全部显示,请点此查看更多更全内容