转:

2018年03月24日 16:00:22 乄阿斗同學 阅读数:2977
 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen497147884/article/details/79678513

POI的XWPFDocument和XWPFTemplate两种方法往word模板中填充数据

  1. import java.io.ByteArrayOutputStream;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.Map.Entry;
  13. import java.util.regex.Matcher;
  14. import java.util.regex.Pattern;
  15.  
  16. import org.apache.poi.POIXMLProperties.CoreProperties;
  17. import org.apache.poi.hwpf.HWPFDocument;
  18. import org.apache.poi.hwpf.usermodel.Range;
  19. import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
  20. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  21. import org.apache.poi.xwpf.usermodel.XWPFParagraph;
  22. import org.apache.poi.xwpf.usermodel.XWPFRun;
  23. import org.apache.poi.xwpf.usermodel.XWPFTable;
  24. import org.apache.poi.xwpf.usermodel.XWPFTableCell;
  25. import org.apache.poi.xwpf.usermodel.XWPFTableRow;
  26.  
  27. import com.deepoove.poi.XWPFTemplate;
  28. import com.deepoove.poi.data.PictureRenderData;
  29. /**
  30. * @author Admin
  31. *
  32. */
  33. public class WriteWordUtil {
  34.  
  35. public void writeDocx(String path, Map<String, String> map) throws Exception {
  36. InputStream is = new FileInputStream(path);
  37. XWPFDocument doc = new XWPFDocument(is);
  38. // XWPFWordExtractor extractor = new XWPFWordExtractor(doc) ;
  39. // String text = extractor.getText();
  40. // System.out.println(text);
  41. // CoreProperties coreProps = extractor.getCoreProperties();
  42. // this.printCoreProperties(coreProps);
  43. // this.close(is);
  44. }
  45.  
  46. /**
  47. * 替换段落里面的变量
  48. *
  49. * @param doc
  50. * 要替换的文档
  51. * @param params
  52. * 参数
  53. */
  54. private void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
  55. Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
  56. XWPFParagraph para;
  57. while (iterator.hasNext()) {
  58. para = iterator.next();
  59. this.replaceInPara(para, params);
  60. }
  61. }
  62.  
  63. /**
  64. * 替换段落里面的变量
  65. *
  66. * @param para
  67. * 要替换的段落
  68. * @param params
  69. * 参数
  70. */
  71. private void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
  72. List<XWPFRun> runs;
  73. Matcher matcher;
  74. if (this.matcher(para.getParagraphText()).find()) {
  75. runs = para.getRuns();
  76. for (int i = 0; i < runs.size(); i++) {
  77. XWPFRun run = runs.get(i);
  78. String runText = run.toString();
  79. matcher = this.matcher(runText);
  80. if (matcher.find()) {
  81. while ((matcher = this.matcher(runText)).find()) {
  82. runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
  83. }
  84. // 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
  85. // 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
  86. para.removeRun(i);
  87. if(runText.equals("null")){
  88. runText="";
  89. }
  90. para.insertNewRun(i).setText(runText);
  91. }
  92. }
  93. }
  94. }
  95.  
  96. /**
  97. * 替换表格里面的变量
  98. *
  99. * @param doc
  100. * 要替换的文档
  101. * @param params
  102. * 参数
  103. */
  104. private void replaceInTable(XWPFDocument doc, Map<String, Object> params) {
  105. Iterator<XWPFTable> iterator = doc.getTablesIterator();
  106. XWPFTable table;
  107. List<XWPFTableRow> rows;
  108. List<XWPFTableCell> cells;
  109. List<XWPFParagraph> paras;
  110. while (iterator.hasNext()) {
  111. table = iterator.next();
  112. rows = table.getRows();
  113. for (XWPFTableRow row : rows) {
  114. cells = row.getTableCells();
  115. for (XWPFTableCell cell : cells) {
  116.  
  117. String cellTextString = cell.getText();
  118. for (Entry<String, Object> e : params.entrySet()) {
  119. if (cellTextString.contains("${"+e.getKey()+"}"))
  120. cellTextString = cellTextString.replace("${"+e.getKey()+"}", e.getValue().toString());
  121. }
  122. cell.removeParagraph(0);
  123. if(cellTextString.contains("${") && cellTextString.contains("}")){
  124. cellTextString = "";
  125. }
  126. cell.setText(cellTextString);
  127. // paras = cell.getParagraphs();
  128. // for (XWPFParagraph para : paras) {
  129. // this.replaceInPara(para, params);
  130. // }
  131.  
  132. }
  133. }
  134. }
  135. }
  136.  
  137. /**
  138. * 正则匹配字符串
  139. *
  140. * @param str
  141. * @return
  142. */
  143. private Matcher matcher(String str) {
  144. Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
  145. Matcher matcher = pattern.matcher(str);
  146. return matcher;
  147. }
  148.  
  149. /**
  150. * 关闭输入流
  151. *
  152. * @param is
  153. */
  154. private void close(InputStream is) {
  155. if (is != null) {
  156. try {
  157. is.close();
  158. } catch (IOException e) {
  159. e.printStackTrace();
  160. }
  161. }
  162. }
  163.  
  164. /**
  165. * 关闭输出流
  166. *
  167. * @param os
  168. */
  169. private void close(OutputStream os) {
  170. if (os != null) {
  171. try {
  172. os.close();
  173. } catch (IOException e) {
  174. e.printStackTrace();
  175. }
  176. }
  177. }
  178.  
  179. /**
  180. * 输出CoreProperties信息
  181. *
  182. * @param coreProps
  183. */
  184. private void printCoreProperties(CoreProperties coreProps) {
  185. System.out.println(coreProps.getCategory()); // 分类
  186. System.out.println(coreProps.getCreator()); // 创建者
  187. System.out.println(coreProps.getCreated()); // 创建时间
  188. System.out.println(coreProps.getTitle()); // 标题
  189. }
  190.  
  191. /**
  192. * word占位用${object}有缺陷不能填充图片
  193. * @param filePath
  194. * @param params
  195. * @throws Exception
  196. */
  197. public static String templateWrite(String filePath, Map<String, Object> params,String outFilePath)throws Exception{
  198. InputStream is = new FileInputStream(filePath);
  199. WriteWordUtil writeWordUtil = new WriteWordUtil();
  200. XWPFDocument doc = new XWPFDocument(is);
  201. // 替换段落里面的变量
  202. writeWordUtil.replaceInPara(doc, params);
  203. // 替换表格里面的变量
  204. writeWordUtil.replaceInTable(doc, params);
  205. OutputStream os = new FileOutputStream(outFilePath);
  206. doc.write(os);
  207. writeWordUtil.close(os);
  208. writeWordUtil.close(is);
  209. os.flush();
  210. os.close();
  211. return "";
  212. }
  213. /**
  214. * word占位用{{object}}比较完美可以填充图片
  215. * @param filePath
  216. * @param params
  217. * @param outFilePath
  218. * @return
  219. * @throws Exception
  220. */
  221. public static String templateWrite2(String filePath, Map<String, Object> params,String outFilePath)throws Exception{
  222. XWPFTemplate template = XWPFTemplate.compile(filePath).render(params);
  223. FileOutputStream out = new FileOutputStream(outFilePath);
  224. template.write(out);
  225. out.flush();
  226. out.close();
  227. template.close();
  228. return "";
  229. }
  230.      public static void main(String[] args) throws Exception {
  231. Map<String, Object> params = new HashMap<String, Object>();
  232. params.put("JSDWMC", "项目1\r\na");//  
  233. params.put("XMMC", "项目2\r\nb");//  
  234. params.put("1", "1");//
  235. params.put("2", "2");//
  236. params.put("object1", "o1");//  
  237. params.put("object2", "o2");//
  238.                 params.put("localPicture", new PictureRenderData(120, 120, "D:\\A.png"));
  239. templateWrite("D:\\template\\1.docx", params, "D:\\template\\5.docx");
  240. templateWrite2("D:\\2.docx", params, "D:\\template\\7.docx");
  241.  
  242. }
  243. }

用到的jar包

poi-3.17.jar

poi-examples-3.17.jar

poi-excelant-3.17.jar

poi-ooxml-3.17.jar

poi-ooxml-schemas-3.17.jar

poi-scratchpad-3.17.jar

poi-tl.jar

jar下载:下载地址

POI往word模板中写入数据的更多相关文章

  1. 向Word模板中填充数据

    现在有这样的需求,给Word文档的指定位置填充上特定数据,例如我们有一个终端,用来打印员工的薪资证明,对于一个公司来说,他的薪资证明模板是固定的,变化的地方是员工姓名,部门,职位等.我们只需要将这些指 ...

  2. [转载]java向word模板中填充数据(总结)

    使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...

  3. [原创]java向word模板中填充数据(总结)

    使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...

  4. 将excel中的数据填入word模板中-VBA

    首先将word模板中需要填写excel中数据的空白处用自己独特的字符串标记,比如   数据001  什么的.如下图: 这样,就可以用vba搜寻这些自己独特的标记来根据excel内容填充word了. 第 ...

  5. POI向Excel中写入数据及追加数据

    import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import ...

  6. 使用java Apache poi 根据word模板生成word报表

    项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...

  7. 读取word模板,填充数据后导出

    一.需求说明 定期生成word报告,报告中含有文本.表格.图表等元素,依次获取进行替换,保留原有样式,生成新的word文档 二.引入依赖 <dependency> <groupId& ...

  8. poi导出word模板项目实例(一个文件)

    在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式, 1.jsp 页面   <table class="formTa ...

  9. 复制excel表,往excel表中写入数据

    import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import jav ...

随机推荐

  1. NO.2:自学tensorflow之路------BP神经网络编程

    引言 在上一篇博客中,介绍了各种Python的第三方库的安装,本周将要使用Tensorflow完成第一个神经网络,BP神经网络的编写.由于之前已经介绍过了BP神经网络的内部结构,本文将直接介绍Tens ...

  2. 图解 Go 并发

    你很可能从某种途径听说过 Go 语言.它越来越受欢迎,并且有充分的理由可以证明. Go 快速.简单,有强大的社区支持.学习这门语言最令人兴奋的一点是它的并发模型. Go 的并发原语使创建多线程并发程序 ...

  3. 最新Python笔试题2017 涵盖知识面广泛

    引言 想找一份Python开发工作吗?那你很可能得证明自己知道如何使用Python.下面这些问题涉及了与Python相关的许多技能,问题的关注点主要是语言本身,不是某个特定的包或模块.每一个问题都可以 ...

  4. (第九周)Beta-1阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...

  5. 结对编程-->总结报告

    项目github地址 PSP时间表格 结对编程中关于Information Hiding, Interface Design, Loose Coupling原则的使用 Information Hidi ...

  6. 第二阶段Sprint冲刺会议5

    进展:能够保存到手机或内存卡上,没有实现自己选路径,指定路径为内存卡并能够播放已录制好的视频.

  7. Teamwork(The second day of the team)

    梦之翼 5.20工作汇报: Master:杨灵超 产品负责人:杨家安 第一次Sprint的目标和时间: 目标:这一次的sprint我们想先做成一个可以运行的可以展示,但是功能或许还不是很完善的一个模型 ...

  8. ADO.NET使用using关闭数据库连接

    using (SqlConnection conn = new SqlConnection(source)) { // open the connoction conn.Open(); // Do s ...

  9. profibus总线和profibus dp的区别

    profibus总线和profibus dp的区别:PROFBUS是一种国际性的开放式的现场总线标准,它既可以用于高速并且对于时间苛求的数据传输,也可以用于大范围的复杂通讯场合.PROFBUS-DP是 ...

  10. 第六周PSP&进度条

    团队项目PSP 一.表格:     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论alpha完成情况并总结 9:40 11:20 17 ...