使用 Apache POI 阅读 Word 文档中的部分
Read sections from Word documents with Apache POI
我有一个基于模板创建的 Word 文档 (.docx
)。它有 4 个部分:标题、文档类型、标识和签名。
我一直在寻找一种使用 Apache POI 的 XWPF 阅读这些部分的方法。有什么建议吗?
我找到了解决方案,我需要在顶部的评论是通过文档并获取 word 文档的块部分。
使用下一页的信息
它的作用是通过文档拯救所有部分。
我项目中使用的代码很好
public class decodeWord {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("/WORKSPACE/TestDoc.docx");
XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));
List<AbstractXWPFSDT> sdts = extractAllSDTs(xdoc);
for (AbstractXWPFSDT sdt : sdts) {
System.out.println(sdt.getTag() + " " + sdt.getContent().getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static List<AbstractXWPFSDT> extractAllSDTs(XWPFDocument doc) {
List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
List<XWPFHeader> headers = doc.getHeaderList();
for (XWPFHeader header : headers) {
sdts.addAll(extractSDTsFromBodyElements(header.getBodyElements()));
}
sdts.addAll(extractSDTsFromBodyElements(doc.getBodyElements()));
List<XWPFFooter> footers = doc.getFooterList();
for (XWPFFooter footer : footers) {
sdts.addAll(extractSDTsFromBodyElements(footer.getBodyElements()));
}
for (XWPFFootnote footnote : doc.getFootnotes()) {
sdts.addAll(extractSDTsFromBodyElements(footnote.getBodyElements()));
}
return sdts;
}
private static List<AbstractXWPFSDT> extractSDTsFromBodyElements(List<IBodyElement> elements) {
List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
for (IBodyElement e : elements) {
if (e instanceof XWPFSDT) {
XWPFSDT sdt = (XWPFSDT) e;
sdts.add(sdt);
} else if (e instanceof XWPFParagraph) {
XWPFParagraph p = (XWPFParagraph) e;
for (IRunElement e2 : p.getIRuns()) {
if (e2 instanceof XWPFSDT) {
XWPFSDT sdt = (XWPFSDT) e2;
sdts.add(sdt);
}
}
} else if (e instanceof XWPFTable) {
XWPFTable table = (XWPFTable) e;
sdts.addAll(extractSDTsFromTable(table));
}
}
return sdts;
}
private static List<AbstractXWPFSDT> extractSDTsFromTable(XWPFTable table) {
List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
for (XWPFTableRow r : table.getRows()) {
for (ICell c : r.getTableICells()) {
if (c instanceof XWPFSDTCell) {
sdts.add((XWPFSDTCell) c);
} else if (c instanceof XWPFTableCell) {
sdts.addAll(extractSDTsFromBodyElements(((XWPFTableCell) c).getBodyElements()));
}
}
}
return sdts;
}
}
我有一个基于模板创建的 Word 文档 (.docx
)。它有 4 个部分:标题、文档类型、标识和签名。
我一直在寻找一种使用 Apache POI 的 XWPF 阅读这些部分的方法。有什么建议吗?
我找到了解决方案,我需要在顶部的评论是通过文档并获取 word 文档的块部分。
使用下一页的信息
它的作用是通过文档拯救所有部分。
我项目中使用的代码很好
public class decodeWord {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("/WORKSPACE/TestDoc.docx");
XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis));
List<AbstractXWPFSDT> sdts = extractAllSDTs(xdoc);
for (AbstractXWPFSDT sdt : sdts) {
System.out.println(sdt.getTag() + " " + sdt.getContent().getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static List<AbstractXWPFSDT> extractAllSDTs(XWPFDocument doc) {
List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
List<XWPFHeader> headers = doc.getHeaderList();
for (XWPFHeader header : headers) {
sdts.addAll(extractSDTsFromBodyElements(header.getBodyElements()));
}
sdts.addAll(extractSDTsFromBodyElements(doc.getBodyElements()));
List<XWPFFooter> footers = doc.getFooterList();
for (XWPFFooter footer : footers) {
sdts.addAll(extractSDTsFromBodyElements(footer.getBodyElements()));
}
for (XWPFFootnote footnote : doc.getFootnotes()) {
sdts.addAll(extractSDTsFromBodyElements(footnote.getBodyElements()));
}
return sdts;
}
private static List<AbstractXWPFSDT> extractSDTsFromBodyElements(List<IBodyElement> elements) {
List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
for (IBodyElement e : elements) {
if (e instanceof XWPFSDT) {
XWPFSDT sdt = (XWPFSDT) e;
sdts.add(sdt);
} else if (e instanceof XWPFParagraph) {
XWPFParagraph p = (XWPFParagraph) e;
for (IRunElement e2 : p.getIRuns()) {
if (e2 instanceof XWPFSDT) {
XWPFSDT sdt = (XWPFSDT) e2;
sdts.add(sdt);
}
}
} else if (e instanceof XWPFTable) {
XWPFTable table = (XWPFTable) e;
sdts.addAll(extractSDTsFromTable(table));
}
}
return sdts;
}
private static List<AbstractXWPFSDT> extractSDTsFromTable(XWPFTable table) {
List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
for (XWPFTableRow r : table.getRows()) {
for (ICell c : r.getTableICells()) {
if (c instanceof XWPFSDTCell) {
sdts.add((XWPFSDTCell) c);
} else if (c instanceof XWPFTableCell) {
sdts.addAll(extractSDTsFromBodyElements(((XWPFTableCell) c).getBodyElements()));
}
}
}
return sdts;
}
}