You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache POI 5.3.0:如何查找通过代码创建的文本框内容?

查找POI创建的Word文本框内容

你的遍历代码存在两个核心问题:语法错误,以及没有精准定位文本框的嵌套内容。以下是修正后的解决方案:

问题分析

你创建的文本框是通过CTGroup生成,再包装成CTPicture存入Run的pict节点中。文本内容嵌套在<txbxContent> -> <p> -> <r> -> <t>层级下,直接打印pict.getDomNode().getTextContent()会包含大量XML标签和冗余内容,无法直接提取有效文本。

正确遍历方法

方法1:使用XPath快速定位

import org.w3c.dom.Node;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathExpressionException;

// 遍历文档段落、Run、Pict节点
for (XWPFParagraph para : document.getParagraphs()) {
    for (XWPFRun run : para.getRuns()) {
        for (CTPicture pict : run.getPictList()) {
            Node pictNode = pict.getDomNode();
            XPath xpath = XPathFactory.newInstance().newXPath();
            try {
                // 精准提取文本框内的文本
                String textBoxText = xpath.evaluate("//txbxContent/p/r/t/text()", pictNode);
                if (!textBoxText.isBlank()) {
                    System.out.println("找到文本框内容:" + textBoxText);
                }
            } catch (XPathExpressionException e) {
                e.printStackTrace();
            }
        }
    }
}

方法2:DOM递归遍历(无XPath依赖)

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

// 遍历主逻辑
for (XWPFParagraph para : document.getParagraphs()) {
    for (XWPFRun run : para.getRuns()) {
        for (CTPicture pict : run.getPictList()) {
            findTextBoxContent(pict.getDomNode());
        }
    }
}

// 递归查找文本框内容的辅助方法
private static void findTextBoxContent(Node node) {
    if ("txbxContent".equals(node.getNodeName())) {
        // 遍历txbxContent下的段落、Run、文本节点
        NodeList childNodes = node.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node pNode = childNodes.item(i);
            if ("p".equals(pNode.getNodeName())) {
                NodeList pChildren = pNode.getChildNodes();
                for (int j = 0; j < pChildren.getLength(); j++) {
                    Node rNode = pChildren.item(j);
                    if ("r".equals(rNode.getNodeName())) {
                        NodeList rChildren = rNode.getChildNodes();
                        for (int k = 0; k < rChildren.getLength(); k++) {
                            Node tNode = rChildren.item(k);
                            if ("t".equals(tNode.getNodeName())) {
                                System.out.println("文本框内容:" + tNode.getTextContent());
                            }
                        }
                    }
                }
            }
        }
    }
    // 递归遍历所有子节点
    NodeList childNodes = node.getChildNodes();
    for (int i = 0; i < childNodes.getLength(); i++) {
        findTextBoxContent(childNodes.item(i));
    }
}

原遍历代码的语法错误修正

原代码存在两处语法问题:

  1. document.getParagraphs().getRuns() 错误:需先遍历每个XWPFParagraph,再调用para.getRuns()
  2. foreach 应为Java标准方法名forEach,箭头符号需正确写为->

内容的提问来源于stack exchange,提问作者Asya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:54:53