最近一直在做与导出这部分相关的事情,有一个就是需要将数据库中查询到的信息写入到word模板中再进行导出。下面的代码直接复制使用即可,没啥毛病,无论是段落中的,还是表格中的,都是有效的。使用过程中遇到的一些问题我也写在注释中了,如果你也遇到类似的问题,或许可以参考一下。

package com.dong.poi.wordReplace;import org.apache.poi.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.*;import java.io.FileOutputStream;
import java.util.*;
/**
* @Author: 雪浪风尘
* @Date: 2020/10/16
*/
public class wordReplace {/***//*** @Author: 雪浪风尘* 1、思路就是使用map存放要修改的值以及修改后的值。遍历整个word文档,当遇到的字段与map中的key相同时,就替换。所以这个key没有必要* 加个${}之类的,反而更容易出现错误,怎样方便怎样写* 2、可以会存在一部分替换了,而另一部分却没有替换,可能是格式的问题,将那些能够替换的复制到不能替换的应该就可以了。*/public static void searchAndReplace(String srcPath, String destPath, Map<String, String> map) {try {XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(srcPath));/*** 替换段落中的指定文字*/Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();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 (Map.Entry<String, String> e : map.entrySet()) {if (cell.getText().equals(e.getKey())) {//如果单元格中的变量和‘键’相等,就用‘键’所对应的‘值’代替。cell.removeParagraph(0);//所以这里就要求每一个单元格只能有唯一的变量。cell.setText(e.getValue());}}}}}FileOutputStream outStream = null;outStream = new FileOutputStream(destPath);document.write(outStream);outStream.close();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Map<String, String> map = new HashMap<>();map.put("no1", "雪浪风尘");map.put("no2", "千寻一醉");map.put("no3", "江山如画");map.put("no4", "融化黑暗之温暖");String srcPath = "F:\\1.docx";String destPath = "F:\\m.doc";searchAndReplace(srcPath, destPath, map);}
}

代码直接复制使用即可,也可以在github上下载:
https://github.com/PonnyDong/poi
下载之后在poi.wordReplace包中查看。

关于Java使用poi导出word可以参考我的另一篇:
Java使用poi导出word(亲测有效)

Java使用poi根据word模板进行导出(有效可行)相关推荐

  1. java使用poi在word模板中替换柱状图、折线图、饼图、表格、文本、图片

    介绍 java使用poi在word模板中替换柱状图.折线图.饼图.表格.文本.图片 软件架构 安装教程 环境搭建:jdk1.8.0_291.maven1.8.0_291 IDEA工具:IntelliJ ...

  2. apache poi使用例_使用java Apache poi 根据word模板生成word报表例子

    [实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...

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

    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...

  4. java使用poi替换word模板

    poi 操作word文档 0. 参考文档 感谢大萌音音's B站视频的分享, 如有不懂, 可以去看这个视频 1. poi 依赖 <dependency><groupId>org ...

  5. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

  6. 记录java使用POI实现word模板数据填充

    一.前言 最近项目遇到个需求,在模板中填充数据,刚开始是用smartBi报表进行填充,输出参数都是必录,无法满足需求.在网上查了很多资料,有些需要把文档转成xml格式修改里面内容,IDEA里面修改要替 ...

  7. 最新实用版——JAVA使用POI替换Word模板中指定字符,并可插入图片。

    JAVA替换Word模板指定字符,并可插入图片. 在一年之前还之前有写过一篇使用jacob对word插入图片的博客.点击率蛮高8800多次,当然多亏了百度搜索引擎的帮忙

  8. java使用POI根据word模板生成文档,并且根据参数值实现换行

    一,word模板如下 二,将word模板中的参数对应的值放到map中 /*** 将word模板中需要的参数值统一放到map中* * @param resource* @param template* ...

  9. java openxml word_OpenXml操作word模板并导出

    /// ///设置表格数据/// /// 表格索引 /// 数据表 /// 数据配置 /// 表头占用行数 public void SetTableData(int tableIndex, DataT ...

最新文章

  1. python的第三方库-Python第三方库安装和卸载
  2. c#中datareader中HasRows属性和Read方法的区别
  3. CodeForces - 1337E Kaavi and Magic Spell(dp)
  4. 【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务
  5. jsp页面页面post传值_几种JSP页面传值方式
  6. 黑马程序员——java语言基础——面向对象
  7. iPhone 13凌晨发布,电池容量较iPhone 12最高有望提升20%(文末有福利)
  8. 苹果智能音箱HomePod跳票了,上市日期推迟到明年
  9. C#如何测量字符串的高度宽度和精确取得字符串的高度宽度
  10. java实现数据结构-堆排序
  11. txt文档转excel方法
  12. 九款即时通讯软件大盘点
  13. java飞机大战boss素材_java小游戏飞机大战 源代码以及素材
  14. taskctl跨调度服务依赖实现
  15. 数据库查询之内连接,左连接,右连接
  16. 【微信公众号开发】微信支付-退款通知
  17. 【ROS系列】运行rosrun topic_demo talker出错
  18. 我与外企上司的四个职场故事
  19. Android AccountManager帐号管理(一)
  20. 算法导论 3.2-1 关于单调递增函数的证明

热门文章

  1. 【2019暑假集训】07.12比赛总结
  2. 企业信息化,电商商品详情API接口,数据返回值说明,商品详情,关键词搜索,价格监控,卖家买家订单等相关数据
  3. 省选游记暨后期基础规划
  4. 开源软件使用的风险和应对方法
  5. 记录一下困扰我多天的问题————PDF.js工具的跨域访问pdf文件
  6. 腾讯云短信服务的申请和验证使用详细流程
  7. 深度自适应增量学习(Incremental Learning Through Deep Adaptation)
  8. docker android模拟器,「docker实战篇」python的docker-创建appium容器以及设置appium容器连接安卓模拟器(31)...
  9. 黑马程序员C++基础入门(二)——程序流程结构 - 数组
  10. 12306铁路系统软件需要改善