第一步:在项目中导入POI的jar包,以及相关的jar包。

所需的jar包列表:

下载地址:http://download.csdn.net/download/qq_34908167/10046670

第二步:建立util工具类。

public class DocxUtil{/*** @Description: 将t中的字段转换成替换模板需要的数据${字段}-->字段值
*      在word模板中变量为${valuename},为每个值建一个以‘${valuename}’为键,‘value’为值的Map集合,
*      利用键去和Word模板中寻找相等的变量*/public <T> Map<String, String> copyParamFromBean(T t, Map<String, String> params) {Field[] fields = t.getClass().getDeclaredFields();String key;String value;for (Field field : fields) {String fieldName = field.getName();key = "${" + fieldName + "}";String name = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);try {value = String.valueOf(t.getClass().getMethod(name).invoke(t));params.put(key, value);} catch (Exception e) {e.printStackTrace();}}return params;}
/***
*替换Word模板中的对应变量。
*两种情况:1-段落中的变量。 2-表格中的变量
*/public static void searchAndReplace(XWPFDocument document,Map<String, String> map) {try {// 替换段落中的指定文字Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();//获得word中段落while (itPara.hasNext()) {       //遍历段落XWPFParagraph paragraph = (XWPFParagraph) itPara.next();Set<String> set = map.keySet();Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {String key = iterator.next();List<XWPFRun> run=paragraph.getRuns();for(int i=0;i<run.size();i++){if(run.get(i).getText(run.get(i).getTextPosition())!=null &&run.get(i).getText(run.get(i).getTextPosition()).equals(key)){/*** 参数0表示生成的文字是要从哪一个地方开始放置,设置文字从位置0开始* 就可以把原变量替换掉*/run.get(i).setText(map.get(key),0);}}}}         // 替换表格中的指定文字Iterator<XWPFTable> itTable = document.getTablesIterator();//获得Word的表格while (itTable.hasNext()) { //遍历表格XWPFTable table = (XWPFTable) itTable.next();int count = table.getNumberOfRows();//获得表格总行数for (int i = 0; i < count; i++) { //遍历表格的每一行XWPFTableRow row = table.getRow(i);//获得表格的行List<XWPFTableCell> cells = row.getTableCells();//在行元素中,获得表格的单元格for (XWPFTableCell cell : cells) {   //遍历单元格for (Entry<String, String> e : map.entrySet()) {if (cell.getText().equals(e.getKey())) {//如果单元格中的变量和‘键’相等,就用‘键’所对应的‘值’代替。cell.removeParagraph(0);//所以这里就要求每一个单元格只能有唯一的变量。cell.setText(e.getValue());}}}}}} catch (Exception e) {e.printStackTrace();}}
/*** 关闭输出流** @param os*/public void close(OutputStream os) {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}
}

第三步:在项目的对应目录下放入Word模板。

这里给出我的Word模板:http://download.csdn.net/download/qq_34908167/10046772

第四步:导出Word的java实现。

public String exportDoc(){XWPFDocument doc = null;OutputStream out = null;FileInputStream in = null;DocxUtil docxUtil = null;try {String rootPath = "";ServletContext context = servletRequest.getSession().getServletContext();String studentId = this.servletRequest.getParameter("studentid");//得到页面的参数RankExportDocVO docVo=null;if (studentId!=null) {rootPath = context.getRealPath("/docmodel/PG/RankPrintAll_WordTemplate.docx");//Word模板所在的路径docVo = rankPrintService.queryStudentInfo((studentId);//调用service得到对应的VO类}else{throw new Exception("传输字段为空!");}Map<String, String> params = new HashMap<String, String>();docxUtil = new DocxUtil();XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(rootPath));//读取Word模板docxUtil.copyParamFromBean(docVo, params);//调用DocxUtil中的copyParamFromBean方法,为VO的每个值建立“${valuename}”键docxUtil.searchAndReplace(document, params);//替换模板中的对应变量。// 清空responsethis.servletResponse.reset();// 设置response的HeaderString userAgent = this.servletRequest.getHeader("User-Agent");String realname = "学生信息文档_"+docVo.getXm()+".docx";//最终导出文档的新文档名if (userAgent.contains("Firefox")) {// 采用BASE64编码realname = "=?UTF-8?B?" + new BASE64Encoder().encode(realname.getBytes("utf-8")) + "?=";} else {// 其它浏览器 IE 、google 采用URL编码realname = URLEncoder.encode(realname, "utf-8");realname = realname.replace("+", " ");}servletResponse.setHeader("Content-Disposition", "attachment;filename=" + realname);String minitype = ServletActionContext.getServletContext().getMimeType(realname);servletResponse.setContentType(minitype);out = this.servletResponse.getOutputStream();document.write(out);} catch (Exception e) {e.printStackTrace();} finally {if (null != docxUtil) {docxUtil.close(out);//关闭流}}return null;}

这就是利用Java-poi技术导出Word文档的全部步骤。

这样的好处,就在于我们可以根据需求制定我们需要的Word样式。

后语

注意事项:

1:Word模板中,表格的单元格的变量必须是唯一的,如果需要多个变量,我们可以利用word的隐藏表格功能,

来实现视觉上的一个单元格有多个变量的效果。

2:Word模板中的变量左右不能有空格,不然不能识别。

3:都 9102 年了,还在看java-poi吗?去看看我的另外一篇使用freemaker来根据模板定制word文档的博文吧:

Java-Freemarker替换模板文件.ftl中的变量,生成Word文档

-----------------------------------------------------------------------------------------不关注我“象话”吗?(哈哈,逗比)

Java-POI替换Word模板文档中的变量,生成Word文档相关推荐

  1. 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你

    在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 目录 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 1.文章中的标题较多,每个单独调整格式太费劲,这里我们用一 ...

  2. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  3. 浅析如何在Nancy中使用Swagger生成API文档

    原文:浅析如何在Nancy中使用Swagger生成API文档 前言 上一篇博客介绍了使用Nancy框架内部的方法来创建了一个简单到不能再简单的Document.但是还有许许多多的不足. 为了能稍微完善 ...

  4. python套用word模板_如何使用Python批量创建Word模板

    如何使用 Python 批量创建 Word 模板 在日常工作中我们经常需要重复性地将同一份内容的 Word 文档资料发送 给多个不同客户, 此时 Word 文档内容可能只有客户署名不同. 或者只有部分 ...

  5. python 生成html文档,Python使用pyh生成HTML文档的方法示例

    Python使用pyh生成HTML文档的方法示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python使用pyh生成HTML文档的方法示例.txt ] (友 ...

  6. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...

  7. Java项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...

  8. java web 操作word文档_Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  9. java poi替换word_利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

最新文章

  1. 奕新集团--RAC环境后续
  2. Quick BI 功能“炸弹”:即席分析、模板市场、企业微信免密登录等强势功能
  3. mysql timeout
  4. 可用性SLA还不懂?看完这个故事就懂了
  5. Bootstrap响应式图片
  6. isinstance()函数的应用
  7. ldflags android,Android 开发手记一 NDK编程实例
  8. 决策树(六)--随机森林
  9. DL_C1_week4_2(build a deep neural network 2)
  10. [亲测]Oracle数据库约束
  11. 小白如何入门计算机编程?
  12. Error: ImageIO: PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk 解决
  13. 计算机cpu温度显示原理,鲁大师的测温功能是怎么做到的?测温原理介绍
  14. import cv2 失败“找不到指定模块”解决办法
  15. 渲染图用计算机配置,3d渲图电脑配置清单
  16. android短信接收器的实现,可以实现自动填写短信验证码功能
  17. win2003 服务器设置 完全版 作者:冰盾防火墙
  18. 西游记中的袁守诚的真实身份是谁?为何能知玉帝谕旨?
  19. 关于测速MB/S,Mb/S,KB/s的区别
  20. regsvr32.exe使用详解

热门文章

  1. Python实现Office自动化办公(实现Python对word基本操作、对excel基本操作、在word中插入表格、word中插入网站爬虫取图)
  2. 自动驾驶采标系列一:自动驾驶数据采集资质及采集数据出境的调研分析
  3. 读书软件源码,实现书籍阅读的其他功能
  4. 关于电力行业的那些通信协议(376.1/376.2/376.3/645/698)
  5. 阿里巴巴赴美上市,市值将超千亿
  6. 项目一:《小米官网》
  7. IPAD,售前演示必备利器
  8. hgame2023 week3 writeup
  9. Nokia78如何格机
  10. 计算机英语单词的软件,计算机英语高级词汇·软件篇