gpt4 book ai didi

java - 无法按 Apache POI 中的 Word 文档 (docx) 的顺序读取所有内容

转载 作者:行者123 更新时间:2023-11-30 05:30:09 24 4
gpt4 key购买 nike

我一直在尝试读取Word文档中的所有内容(包括表格、图片、段落)。我可以使用 getBodyElementsIterator() 读取表格和段落,但它不会读取文档中存在的图片。虽然我可以使用 getAllPictures() 单独读取图片,但我需要按顺序读取所有内容。

我尝试在 getBodyElementsIterator() 内循环时查找 XWPFPicture 实例,但找不到任何图像实例。

Iterator<IBodyElement> iter = xdoc.getBodyElementsIterator();
while (iter.hasNext()) {
IBodyElement elem = iter.next();
if (elem instanceof XWPFParagraph) {
System.out.println("para - "+elem.getClass());
} else if (elem instanceof XWPFTable) {
System.out.println("table - "+elem);
} else if (elem instanceof XWPFPictureData){
System.out.println("picture - "+elem);
} else {
System.out.println("else - "+elem);
}
}

这是我得到的输出。

paraorg.apache.poi.xwpf.usermodel.XWPFParagraph@4d3167f4
paraorg.apache.poi.xwpf.usermodel.XWPFParagraph@ed9d034
tableorg.apache.poi.xwpf.usermodel.XWPFTable@6121c9d6
paraorg.apache.poi.xwpf.usermodel.XWPFParagraph@87f383f
paraorg.apache.poi.xwpf.usermodel.XWPFParagraph@4eb7f003

它包含段落和表格,但不包含任何图片

最佳答案

正如评论中所述,如何在 apache poi 中按 Word 文档 (docx) 的顺序读取所有内容的问题太过宽泛,无法在这里回答。 *.docxOffice Open XML 文件格式的 ZIP 存档。它包含文档正文的 document.xml。这是非常复杂的 XML,需要遍历。但是 document.xml 可能包含对 *.docx ZIP 存档中其他资源的引用,然后也需要遍历该存档。

我能提供的是这个遍历过程的模板。它始于 XWPFDocument首先遍历所有 IBodyElement就在里面。根据找到的IBodyElement类型进行进一步的遍历处理。

import java.io.FileInputStream;

import org.apache.poi.xwpf.usermodel.*;

import java.util.List;

public class WordReadAllContent {

static void traversePictures(List<XWPFPicture> pictures) throws Exception {
for (XWPFPicture picture : pictures) {
System.out.println(picture);
XWPFPictureData pictureData = picture.getPictureData();
System.out.println(pictureData);
}
}

static void traverseRunElements(List<IRunElement> runElements) throws Exception {
for (IRunElement runElement : runElements) {
if (runElement instanceof XWPFFieldRun) {
XWPFFieldRun fieldRun = (XWPFFieldRun)runElement;
System.out.println(fieldRun.getClass().getName());
System.out.println(fieldRun);
traversePictures(fieldRun.getEmbeddedPictures());
} else if (runElement instanceof XWPFHyperlinkRun) {
XWPFHyperlinkRun hyperlinkRun = (XWPFHyperlinkRun)runElement;
System.out.println(hyperlinkRun.getClass().getName());
System.out.println(hyperlinkRun);
traversePictures(hyperlinkRun.getEmbeddedPictures());
} else if (runElement instanceof XWPFRun) {
XWPFRun run = (XWPFRun)runElement;
System.out.println(run.getClass().getName());
System.out.println(run);
traversePictures(run.getEmbeddedPictures());
} else if (runElement instanceof XWPFSDT) {
XWPFSDT sDT = (XWPFSDT)runElement;
System.out.println(sDT);
System.out.println(sDT.getContent());
//ToDo: The SDT may have traversable content too.
}
}
}

static void traverseTableCells(List<ICell> tableICells) throws Exception {
for (ICell tableICell : tableICells) {
if (tableICell instanceof XWPFSDTCell) {
XWPFSDTCell sDTCell = (XWPFSDTCell)tableICell;
System.out.println(sDTCell);
//ToDo: The SDTCell may have traversable content too.
} else if (tableICell instanceof XWPFTableCell) {
XWPFTableCell tableCell = (XWPFTableCell)tableICell;
System.out.println(tableCell);
traverseBodyElements(tableCell.getBodyElements());
}
}
}

static void traverseTableRows(List<XWPFTableRow> tableRows) throws Exception {
for (XWPFTableRow tableRow : tableRows) {
System.out.println(tableRow);
traverseTableCells(tableRow.getTableICells());
}
}

static void traverseBodyElements(List<IBodyElement> bodyElements) throws Exception {
for (IBodyElement bodyElement : bodyElements) {
if (bodyElement instanceof XWPFParagraph) {
XWPFParagraph paragraph = (XWPFParagraph)bodyElement;
System.out.println(paragraph);
traverseRunElements(paragraph.getIRuns());
} else if (bodyElement instanceof XWPFSDT) {
XWPFSDT sDT = (XWPFSDT)bodyElement;
System.out.println(sDT);
System.out.println(sDT.getContent());
//ToDo: The SDT may have traversable content too.
} else if (bodyElement instanceof XWPFTable) {
XWPFTable table = (XWPFTable)bodyElement;
System.out.println(table);
traverseTableRows(table.getRows());
}
}
}

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

String inFilePath = "./WordDocument.docx";

XWPFDocument document = new XWPFDocument(new FileInputStream(inFilePath));
traverseBodyElements(document.getBodyElements());

document.close();
}

}

这是一份工作草案。我确定,我忘记了什么。

关于java - 无法按 Apache POI 中的 Word 文档 (docx) 的顺序读取所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57726756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com