最近处理word模板中发现存在文本框类型的模板,以前从未处理过只能百度一下了,结果大部分出现的都是https://jingyan.baidu.com/article/e4d08ffdd352690fd2f60d8b.html 这种情况的,大多数针对的都是固定的文档格式,感觉很难弄明白,官网也直指大概提了一下,并没有明显的demo,不过从侧面来讲倒是提供了解决的办法,只能靠自己了,首先需要处理的模板后缀名称改成rar格式,本身word就是一堆xml的集合,在解压之后找到对应的document.xml,这个就是对应的整个文档结构了,慢慢遍历自己的节点,找打需要修改的地方,一层一层的去寻找,然后移动对应的XmlCursor到制定位置,去寻找,整个过程很浪费耐心,所以处理之前一定要格式化好的xml,网上有在线的工具,我只是把自己处理的过程分享一下,因为我是替换的文本,所以结构先列出来

public static List<String>patternList=new ArrayList();
    //需要处理的节点名称
     static {    
         patternList.add("mc:AlternateContent");
        patternList.add("mc:Choice");
        patternList.add("w:drawing");
         patternList.add("wp:anchor");
        patternList.add("a:graphic");
        patternList.add("a:graphicData");
        patternList.add("wps:wsp");
         patternList.add("wps:txbx");
         patternList.add("w:txbxContent");
         patternList.add("w:p");
         patternList.add("w:r");
        patternList.add("w:t");    
    }

里面包含每一需要处理的节点的名称,然后就是进行回朔找到patternList中最后一个元素位置,也就是w:t的位置,当XmlCursor光标移动到对应的位置就可以执行正常的替换工作,

详细代码如下

public static void changeTextBox( XWPFDocument document,Map<String, String>map) {
        
        
        for(XWPFParagraph paragraph:document.getParagraphs())
            for(XmlObject object:paragraph.getCTP().getRArray())
        {
     XmlCursor cursor = object.newCursor();
     eachchild(cursor, 0,map);
        }
    }

//回朔查找,因为并不是每一个文本框中只有一个可替换的地方
    public static void eachchild(XmlCursor cursor,int start,Map<String, String>map) {

//预计子节点个数应该是小于10个节点
        for(int i=0;i<10;i++)
        {

//如果可以移动到子节点i
            if(cursor.toChild(i)) {

//如果移动到达的子节点正好是按照顺序是需要的节点 则继续前往下一层
            if(cursor.getDomNode().getNodeName().equals(patternList.get(start))) {
                if(start==patternList.size()-1) {
                    String reString=cursor.getTextValue();
                    for(String e:map.keySet()) {
                        if(reString.contains(e)) {
                        //    执行替换
                            reString=reString.replaceAll(e, map.get(e));
                        }
                    }

//bingo  设置替换节点内容
                    cursor.setTextValue(reString);
                }

//继续下一层  遍历
                eachchild(cursor,start+1,map);
            }else {
                cursor.toParent();
            }
        }
        }

//  此处很重要,如果命中或者未命中都需要 遍历其他节点
        cursor.toParent();
    }

PS:整个代码就是这个样子了,其他的自行补充完整,图片这一块懒得去处理了,只是提供一个大概的解决思路。提供的信息不多,相信你搜索到这篇文章的时候,很多预备知识都已经知道了,我就不再累述。如有问题请私信联系,当然更期待有心人能够补充的更加详细更加完整。转载注明出处,谢谢!

POI 处理word 文档中 文本框模板相关推荐

  1. java利用POI替换word文档中的标签

    java利用POI替换word文档中的标签 <dependency><groupId>org.apache.poi</groupId><artifactId& ...

  2. java poi在word文档中插入图片后文件无法打开

    错误情况 POI生成的word文档包含图片时用office打开失败,提示错误.但是用wps却可以打开. 原因分析 这是因为poi本身的问题,单纯的插入图片是不显示的,可以使用如下处理方式createP ...

  3. Python批量检查docx文档中文本框的内容是否正确

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社,2018.8出版,2021.7第12次印刷 图书详情: 配套资源: 用书教师可 ...

  4. poi 删除 word文档中的图片

    代码片 XWPFDocument doc =WordUtil.createSimpleWord(file, word);//file 对应的文件模板,word传递参数的实体对象List<XWPF ...

  5. POI对word文档中的指定内容添加批注

    public static void main(String[] args) throws Exception {InputStream is = new FileInputStream(new Fi ...

  6. Poi 设置word文档中的表格边框

    https://blog.csdn.net/qq_31189355/article/details/80438506 下面代码分别设置XWPFTable上下左右实线黑色边框,放到头部定义就好.定义完成 ...

  7. Word控件Spire.Doc 【文本】教程(5) ;从 Word 文档中的文本框中提取文本

    文本框的目的是允许用户输入程序要使用的文本信息.也可以从文本框中提取现有的文本信息.以下指南重点介绍如何通过Spire.Doc for .NET从 C# 中 Word 文档的文本框中提取文本. Spi ...

  8. 使用poi操作word文档实现套打功能

    使用poi操作word文档实现套打功能 本文目的是为了分享一个实现套打功能,但是不同于简单的word的文本替换而是采用poi对word的文本框就行操作实现的功能: poi中各种jar的说明 套打的实现 ...

  9. POI生成word文档,图片显示为空白或不显示

    我想要用java,通过poi实现word文档中插入文字和图片来发送邮箱附件.但是发现在对word操作中,图片是白的,size如果设置小了直接没有图片.  经过百度 参考解决 Java poi 3.8 ...

  10. Python读取\修改word文档中的文本框内容

    本文所指的 word文档,都是docx结尾的,如果是doc结尾的,请参考上篇:点我 我们绝大多数的需求都是 利用python-docx 来读取word文档中的内容,进而再对内容进行其他处理,如下代码, ...

最新文章

  1. 1024 | 不加班,带你们一起薅当当的羊毛!
  2. hadoop 第一课 启动dfs 文件系统
  3. SAP QM 采样方案的c1 d1 c2 d2 --多重采样
  4. 从零开始单排学设计模式「策略模式」黑铁 II
  5. 上海人工智能实验室刘宇:从感知AI的发展理解决策AI的未来
  6. Numpy-随机生成以及矩阵的运算
  7. linux kvm百度云,容器与云|如何在 Ubuntu Linux 上使用 KVM 云镜像
  8. IMA文件如何打开,winimage使用方
  9. 最简单的java代码【java基本语法】
  10. 记一次wireshark抓取QQ好友IP和火绒抓取微信IP
  11. CS61A 计算机程序的构造与解释 课程介绍及课程学习总结
  12. 主机安全扫描入门-用Java封装Nmap
  13. Apache DolphinSchedulerShenYu(Incubating)联合 Meetup,暖春 3 月与你相约!
  14. iphone个系列尺寸_iPhone9只是套模iPhone8,这些才是iPhone经典款,你用过哪些?
  15. Windows系统下隐藏的文件
  16. matlab选址与GIS选址,ArcGIS入门教程(13)——多条件学校选址分析
  17. 做私域最常犯的四个错误
  18. 在物理机上安装虚拟机
  19. 玩客云 Armbian Linux
  20. 符号拓展指令CBW、CWD、CDQ、CWDE、CDQE

热门文章

  1. linux nginx 443端口被占用,Nginx拒绝监听端口443(示例代码)
  2. SAP中常用到的会计知识
  3. PIL PIL包的图像缩放的插值算法
  4. 职场思想分享009 | 一个人对待工作的态度决定其成绩的多少?
  5. 智能车基础学习FTM模块
  6. pytest-allure美化——定制化输出测试报告
  7. Android以太网架构源码
  8. Detach Procedure
  9. ffmpeg视频录制
  10. 百度指数-批量查询器