用Java解析大型docx文件

时间:2017-08-17 16:16:39

标签: java apache-poi docx

我有一个需要解析的200页docx文件。但我需要的数据包含在前20页左右。 Apache POI是否有办法只检索部分文档?似乎使用Apache POI从docx文件中获取数据的唯一方法是使用getParagraphs或getText(),当我只需要前几页时,我真的不需要庞大的字符串或段落列表。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

由于*.docx只是ZIP存档,我们也可以从FileSystem获取FileSystems,然后将其内容完全独立于第三方库。< / p>

这是使用StAX的一个非常基本的例子。

import java.io.*;
import java.nio.file.*;

import javax.xml.stream.*;
import javax.xml.stream.events.*;

import javax.xml.namespace.QName;

public class UnZipAndReadOOXMLFileSystem {

 public static void main (String args[]) throws Exception {

  Path source = Paths.get("source.docx");

  FileSystem fs = FileSystems.newFileSystem(source, null);

  Path document = fs.getPath("/word/document.xml");

  XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(Files.newInputStream(document));

  StringBuffer content = new StringBuffer();

  String contentSearched = "the content we are searching for";

  boolean inParagraph = false;
  String paragraphText = "";
  while(reader.hasNext()) {
   XMLEvent event = (XMLEvent)reader.next();
   if(event.isStartElement()){
    StartElement startElement = (StartElement)event;
    QName startElementName = startElement.getName();  
    if(startElementName.getLocalPart().equalsIgnoreCase("p")) { //start element of paragraph
     inParagraph = true;
     content.append("<p>");
     paragraphText = "";
    }
   } else if (event.isCharacters() && inParagraph) { //characters in elements of this paragraph
    String characters = event.asCharacters().getData();
    paragraphText += characters; // can be splitted into different run elements
   } else if (event.isEndElement() && inParagraph) {
    EndElement endElement = (EndElement)event;
    QName endElementName = endElement.getName();  
    if(endElementName.getLocalPart().equalsIgnoreCase("p")) { //end element of paragraph
     inParagraph = false;
     content.append(paragraphText);
     content.append("</p>\r\n");
     //here you can check the paragraphText and exit the while if you found what you are searching for
     if (paragraphText.contains(contentSearched)) break;
    }
   }
  }

  System.out.println(content);

  fs.close();

 }
}

答案 1 :(得分:0)

POI无法使用。

如果您想以缓冲模式阅读,您可以做的是将 docx 文件转换为 xml ,然后逐行阅读,提取文本你需要。 (相当低的水平)

docx 文件已压缩 xml ,您可以使用WinRar打开它们并进行检查。

对于200页的文件执行此操作似乎不值得,除非您的内存非常少。