如何使用docx4j阅读word文档并使用所有样式获取部分文档

时间:2014-07-15 10:34:43

标签: java javascript arrays apache-poi docx4j

我使用docx4j来处理word文档格式。我有一个word文档,它按表的数量划分。我想阅读所有表格,如果我找到一些关键字,那么我想将这些内容带到另一个包含所有格式的word文档。我的word文档如下。

enter image description here

从上面我喜欢看一些低于某些标题的内容。我的关键字是Sample Text。因此,每当重复示例文本时,都需要将内容提取到新的word文档。

我正在使用以下代码。

    MainDocumentPart mainDocumentPart = null;
    WordprocessingMLPackage docxFile = WordprocessingMLPackage.load(new File(fileName));
    mainDocumentPart = docxFile.getMainDocumentPart();

    WordprocessingMLPackage  wordMLPackage = WordprocessingMLPackage.createPackage();

    ClassFinder finder = new ClassFinder(Tbl.class);
    new TraversalUtil(mainDocumentPart.getContent(), finder);
    Tbl tbl = null;

    int noTbls = 0;
    int noRows = 0;
    int noCells = 0;
    int noParas = 0;
    int noTexts = 0;

    for (Object table : finder.results) {
        noTbls++;
        tbl = (Tbl) table;
        // Get all the Rows in the table
        List<Object> allRows = DocxUtility.getDocxUtility()
                .getAllElementFromObject(tbl, Tr.class);
        for (Object row : allRows) {
            Tr tr = (Tr) row;
            noRows++;
            // Get all the Cells in the Row
            List<Object> allCells = DocxUtility.getDocxUtility()
                    .getAllElementFromObject(tr, Tc.class);
            toCell:
            for (Object cell : allCells) {
                Tc tc = (Tc) cell;
                noCells++;
                // Get all the Paragraph's in the Cell
                List<Object> allParas = DocxUtility.getDocxUtility()
                        .getAllElementFromObject(tc, P.class);
                for (Object para : allParas) {
                    P p = (P) para;
                    noParas++;
                    // Get all the Run's in the Paragraph
                    List<Object> allRuns = DocxUtility.getDocxUtility()
                            .getAllElementFromObject(p, R.class);


                    for (Object run : allRuns) {
                        R r = (R) run;

                        // Get the Text in the Run
                        List<Object> allText = DocxUtility.getDocxUtility()
                                .getAllElementFromObject(r, Text.class);
                        for (Object text : allText) {
                            noTexts++;
                            Text txt = (Text) text;                         
                        }
                        System.out.println("No of Text in Para No: " + noParas + "are: " + noTexts);
                    }

                }
                System.out.println("No of Paras in Cell No: " + noCells + "are: " + noParas);
            }
            System.out.println("No of Cells in Row No: " + noRows + "are: " + noCells);
        }
        System.out.println("No of Rows in Table No: " + noTbls + "are: " + noRows);

    }
    System.out.println("Total no of Tables: " + noTbls );

1 个答案:

答案 0 :(得分:3)

假设您的文本是单次运行(即不跨运行分割),那么您可以通过XPath搜索它。或者您可以使用TraversalUtil手动遍历。有关详细信息,请参阅docx4j的入门。

所以找到你的东西很容易。在一般情况下,复制它使用的格式以及其中的任何相关内容都很复杂。有关相关问题的更多信息,请参阅我的帖子http://www.docx4java.org/blog/2010/11/merging-word-documents/