您的位置:首页 > 其它

POI根据docx文件生成word文档(jeesite)

2017-12-21 18:19 483 查看
/**
* 功能描述:
*
* @param params 替换参数
* @param fileName 文件名
* @param request  HttpServletRequest
* @param response HttpServletResponse
* @author Cloud
*/
public  static void exportWord(Map<String, Object> params,String fileName, HttpServletRequest request, HttpServletResponse response){
// 获取应用的根路径
String servletContextRealPath = request.getServletContext().getRealPath("");
XWPFDocument doc;
// 获取模板文件
InputStream is = null;
try {
is = new FileInputStream(servletContextRealPath + "/template/"+fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
doc = new XWPFDocument(is);
//输出到客户端:设置发送到客户端得响应的内容类型
response.setContentType("application/vnd.ms-excel");
//设置下载文件名
response.setHeader("Content-disposition","attachment;filename="+fileName);
//替换表格里面的变量
ExportWord.replaceInPara(doc, params);
//替换表格里面的变量
ExportWord.replaceInTable(doc, params);
OutputStream os = response.getOutputStream();
doc.write(os);
/*ExportWord.close(os);
ExportWord.close(is);
os.flush();
os.close();*/
} catch (IOException e) {
e.printStackTrace();
}
}


注意:OutputStream 不可以关闭不然会报response已提交的异常

替换变量

/**
* 替换段落里面的变量
*
* @param doc    要替换的文档
* @param params 参数
*/
public static void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = iterator.next();
replaceInPara(para, params);
}
}

/**
* 替换段落里面的变量
*
* @param para   要替换的段落
* @param params 参数
*/
public static void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
List<XWPFRun> runs;
Matcher matcher;
if (matcher(para.getParagraphText()).find()) {
runs = para.getRuns();

int start = -1;
int end = -1;
String str = "";
for (int i = 0; i < runs.size(); i++) {
XWPFRun run = runs.get(i);
String runText = run.toString();
if ('$' == runText.charAt(0)&&'{' == runText.charAt(1)) {
start = i;
}
if ((start != -1)) {
str += runText;
}
if ('}' == runText.charAt(runText.length() - 1)) {
if (start != -1) {
end = i;
break;
}
}
}
for (int i = start; i <= end; i++) {
para.removeRun(i);

9feb
i--;
end--;
}
for (String key : params.keySet()) {
if (str.equals(key)) {
para.createRun().setText((String) params.get(key));
break;
}
}

}
}


replaceInPara跟replaceInTable的方法网上有很多例子可以参考的。

我一直在这里反复出现的一个问题是:本机下载文件是可以的,但是放到Linux服务器却报500错误,最后发现将图片当中的’template\’改为’template/’就可以了,原因是:Linux是以’/”分割的,Windows是用’\’分隔,就这个问题弄了3天o(╥﹏╥)o

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: