基于poi对docx格式的文档进行解析则复杂很多,在这之前,需要先对docx文档有一定的认知。
Docx格式文件本质上是一个zip文件。将docx文件的后缀更改为zip后,即可解压该文件,获得如图所示文件夹。
其中文档基本信息存储于“word”文件夹中。
文档内容大部分存储于document.xml中,通过poi我们可以获取document.xml中的所有数据。
//本地文件
InputStream inputStream=new FileInputStream("test.docx");
XWPFDocument xdoc = new XWPFDocument(inputStream);
XWPFDocument类也提供了比较多的方法。在我的需求场景中需要遍历获取所有的节点。
docx.xml打开可以看到它的具体结构
调用poi可获取body下的每一个标签<w:p>存储段落,<w:tbl>存储表格,<w:sectPr>存储一些文章页面设置的属性值。
XmlCursor docCursor = xdoc.getDocument().newCursor();
docCursor.selectPath("./*");
while (docCursor.toNextSelection()) {
XmlObject o = docCursor.getObject();
if (o instanceof CTBody) {
XmlCursor bodyCursor = o.newCursor();
bodyCursor.selectPath("./*");
//遍历<w:body>的每一个标签,分为p,tbl和sectpr
while (bodyCursor.toNextSelection()) {
XmlObject bodyObj = bodyCursor.getObject();
String bodyname = bodyObj.getDomNode().getNodeName();
switch (bodyname) {
case "w:p" -> {
//处理逻辑
}
case "w:tbl" -> { //处理逻辑
}
case "w:sectPr" ->{ //处理逻辑
}
}
}
}
}