我有一个需要解析的200页docx文件。但我需要的数据包含在前20页左右。 Apache POI是否有办法只检索部分文档?似乎使用Apache POI从docx文件中获取数据的唯一方法是使用getParagraphs或getText(),当我只需要前几页时,我真的不需要庞大的字符串或段落列表。有什么建议吗?
答案 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页的文件执行此操作似乎不值得,除非您的内存非常少。