使用 Apache POI 阅读 Word 文档中的部分

Read sections from Word documents with Apache POI

我有一个基于模板创建的 Word 文档 (.docx)。它有 4 个部分:标题、文档类型、标识和签名。

我一直在寻找一种使用 Apache POI 的 XWPF 阅读这些部分的方法。有什么建议吗?

我找到了解决方案,我需要在顶部的评论是通过文档并获取 word 文档的块部分。

使用下一页的信息

APACHE SVN TestXWPFSDT

它的作用是通过文档拯救所有部分。

我项目中使用的代码很好

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;
    }

}