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)); } }
原遍历代码的语法错误修正
原代码存在两处语法问题:
document.getParagraphs().getRuns()错误:需先遍历每个XWPFParagraph,再调用para.getRuns()foreach应为Java标准方法名forEach,箭头符号需正确写为->
内容的提问来源于stack exchange,提问作者Asya
相关产品推荐
相关产品推荐

