POI替换Word中的mark标记(指定字符串)

Stella981
• 阅读 753

哈哈,这是鄙人在博客园的第一篇博客,以前都是在简书上码字,废话不多说,直接开工...

需求分析:工作中遇到的一个技术需求,需要用java代码操作Word,查找Word中的mark标记,然后进行替换,简而言之就是“替换word中的指定字符串”;

解决办法:可以用JACOB和POI来实现,下面我用的是POI操作。

用poi必须要用到Apache的jar包,我用的是最新的poi3.17

链接: https://pan.baidu.com/s/1LfW9JuZdG0IrMz6PVQCdeA 密码: 3t57

-------------------------------我是分割线----------------------------------------

更通俗一点,就是进行全局替换,如下图,我们将字符串mark替换成hello,把字符串aaa替换成bbb:

POI替换Word中的mark标记(指定字符串)

替换后下图:

POI替换Word中的mark标记(指定字符串)

代码如下:

直接写成了一个工具类WordUtil:

这个类能通用doc和docx。

  1 package word;
  2 
  3 import java.io.FileInputStream;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileOutputStream;
  6 import java.io.IOException;
  7 import java.util.List;
  8 import java.util.Map;
  9 import java.util.Map.Entry;
 10 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 11 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 12 import org.apache.poi.xwpf.usermodel.XWPFRun;
 13 import org.apache.poi.xwpf.usermodel.XWPFTable;
 14 import org.apache.poi.xwpf.usermodel.XWPFTableCell;
 15 import org.apache.poi.xwpf.usermodel.XWPFTableRow;
 16 /**
 17  * 
 18  * @author zhoulian
 19  * @time    2018/6/8 15:30:22
 20  */
 21 public class WordUtil {
 22     
 23     private static FileInputStream in;
 24     private static FileOutputStream out;
 25     
 26     /**替换word中的字符串
 27      * 
 28      * @param filePath 文件路径
 29      * @param map    其中,key--替换的标记    value--替换的值
 30      */
 31     public  static void replaceAll(String filePath,Map<String,String> map){
 32         
 33         try {
 34             in = new FileInputStream(filePath);
 35             XWPFDocument doc = new XWPFDocument(in);
 36             
 37             //处理段落
 38             //------------------------------------------------------------------
 39             List<XWPFParagraph> paragraphs = doc.getParagraphs();
 40             for (XWPFParagraph paragraph : paragraphs) {
 41                 List<XWPFRun> runs = paragraph.getRuns();
 42                 for (XWPFRun run : runs) {
 43                     String text = run.getText(0);
 44                     if(text!=null){
 45                         boolean isSetText = false;
 46                         for (Entry<String, String> entry : map.entrySet()) {
 47                             String key = entry.getKey();
 48                             String value = entry.getValue();
 49                             if(text.indexOf(key)!=-1){
 50                                 isSetText = true;
 51                                 text = text.replaceAll(key, value);
 52                             }
 53                             if (isSetText) {
 54                                 run.setText(text, 0);
 55                             }
 56                         }
 57                         
 58                     }
 59                     
 60                 }
 61             }
 62             
 63             //------------------------------------------------------------------
 64             
 65             //处理表格
 66             //------------------------------------------------------------------
 67             List<XWPFTable> tables = doc.getTables();
 68             for (XWPFTable table : tables) {
 69                 List<XWPFTableRow> rows = table.getRows();
 70                 for (XWPFTableRow row : rows) {
 71                     List<XWPFTableCell> cells = row.getTableCells();
 72                     for (XWPFTableCell cell : cells) {
 73                         
 74                         String text = cell.getText();
 75                         if(text!=null){
 76                             for(Entry<String,String> entry:map.entrySet()){
 77                                 String key = entry.getKey();
 78                                 String value = entry.getValue();
 79                                 if(text.equals(key)){
 80                                     //删除原单元格值
 81                                     cell.removeParagraph(0);
 82                                     //设置新单元格的值
 83                                     cell.setText(value);
 84                                 }
 85                             }
 86                         }
 87                     }
 88                     
 89                 }
 90             }
 91             //------------------------------------------------------------------
 92             
 93             out = new FileOutputStream(filePath);  
 94             doc.write(out);  
 95             
 96         } catch (FileNotFoundException e) {
 97             e.printStackTrace();
 98         } catch (IOException e) {
 99             e.printStackTrace();
100         }finally{
101             try {
102                 in.close();
103                 out.close();  
104             } catch (IOException e) {
105                 e.printStackTrace();
106             }
107         }
108         
109         
110         
111     }
112     
113 
114 }

main方法测试如下:

 1 package word;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 public class wordTest {
 7 
 8     public static void main(String[] args) {
 9         String filePath = "C:\\Users\\hp\\Desktop\\temp\\ceshi.docx";
10         Map<String,String> map = new HashMap<String,String>();
11         map.put("mark", "hello");
12         map.put("aaa", "bbb");
13         WordUtil.replaceAll(filePath, map);
14         
15     }
16 
17 }

 至于JACOB操作Word,请看另一片文章:

直通车:https://www.cnblogs.com/DreamDrive/p/7090284.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java使用POI将数据导出放入Excel
本文主要是将数据库取出的数据按照自定义的行列格式导出到excel中,POI则是实现我们需求所用到的技术。POI介绍使用springboot导入相关依赖获取数据(自行处理)完整代码实例:创建excel,将数据写入excel1.POI介绍要想使用POI对Excel进行操作,我们需要先了
Wesley13 Wesley13
3年前
java调用PageOffice生成word
一、在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jacob、poi、java2word、itext。jacob要求服务器必须是windows操作系统,服务器上还必须安装office软件,果断放弃!poi需要针对do
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
jacob安装配置完整版
1.如果要操作word用jacob当然是最好的。要操作Excel用poi是最棒的。其他的(ppt,pdf)我还没有研究不清楚。2.jacob好是好不过代码比较复杂。网络上有基于jacob封装好的jar:java2word。不过呢,目前java2word版本是有bug的(bug:用JUnit测试是没有任何问题的,但放在web上测试就出错了)。只好自
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这