如何删除docx4j中包含特定内容的行

时间:2014-09-22 17:44:28

标签: docx4j

我想删除docx中的特定行,如果它有特定的单词,请说"杀手"。

如何使用docx4j编写程序? 如果我用空数据替换它,该行仍将存在。我想删除整行。 我试过这样的事,

private void replacePlaceholders(WordprocessingMLPackage targetDocument,
            String nameOfTheInvitedGuest) throws JAXBException {

        List<Object> texts = targetDocument.getMainDocumentPart()
                .getJAXBNodesViaXPath(XPATH_TO_SELECT_TEXT_NODES, true);

        System.out.println(texts.size());
        Iterator<Object> itr = texts.iterator();

        while (itr.hasNext()) {
            Object obj = itr.next();

            Text text = (Text) ((JAXBElement) obj).getValue();

            // System.out.println(text.getValue());

            if (text.getValue().contains("Hulk Hogan")) {
                itr.remove();
            }

            else {
                String textValue = replacePlaceholderOfInvitedGuestWithGivenName(
                        nameOfTheInvitedGuest, text.getValue());

                for (Object key : templateProperties.keySet()) {
                    textValue = textValue.replaceAll("\\$\\{" + key + "\\}",
                            (String) templateProperties.get(key));
                }

                text.setValue(textValue);
            }


        } 

        System.out.println(texts.size());
    }

但它仍然显示在docx文件中。

3 个答案:

答案 0 :(得分:1)

docx文件中的Text元素具有父元素。该文本将位于Run内,而P将位于块元素(如段{(1}}节点)或表格单元格内。如果您要根据文本内容删除特定的块元素,一旦找到相关的文本元素,您需要向上移动父元素,并将其删除 - 例如,如果最终的父元素是段落节点,删除它。

如果说,一个段落在Word中显示为3行,并且您试图删除该段落中的第二行,那么您将遇到另一个更具挑战性的问题。

答案 1 :(得分:0)

也许这会对未来的人有所帮助:

if(((org.docx4j.wml.Text) o2).getValue().contains("WhatYouWant")) {
                                // if your text contains "WhatYouWant" then... 

                                Object o4 =((org.docx4j.wml.Text)o2).getParent();
                                //gets R
                                Object o5 = ((org.docx4j.wml.R) o4).getParent();
                                // gets P
                                Object o6 = ((org.docx4j.wml.P) o5).getParent();
                                // gets SdtElement
                                 ((List<List<Object>>) o6).remove(o5);
                                // now you remove your P (paragraph)

                                }

我有一个内容控件(SdtElement),但我需要把它放在List&lt;列表&lt;对象&gt; &GT;不知道为什么,但....你可能还有别的东西,所以在复制/粘贴之前请检查你的document.xml。

这适用于其他有困难的人,就像我了解docx4j

一样

答案 2 :(得分:0)

您可以使用Apache POI从docx文件中删除Text,如下所示。

    public static void removeTextFromDocx(FileInputStream inpudocxfile, String stringToBeReplaced,
        String stringToBeReplacedWith, FileOutputStream outputdocxfile) {
    XWPFDocument document = null;
    try {
        //loading docx file
        document = new XWPFDocument(inpudocxfile);
        for (XWPFParagraph paragraph : document.getParagraphs()) {
            List<XWPFRun> runs = paragraph.getRuns();
            for (XWPFRun run : runs) {
                //reading an entire paragraph. So size of list is 1 and index of first element is 0
                String text = run.getText(0);
                if (text != null) {
                    if (text.contains(stringToBeReplaced)) {
                        text = text.replace(stringToBeReplaced, stringToBeReplacedWith);
                        text = text.trim();
                        run.setText(text, 0);
                    }
                }
            }
        }
        for (XWPFTable table : document.getTables()) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    for (XWPFParagraph paragraph : cell.getParagraphs()) {
                        for (XWPFRun run : paragraph.getRuns()) {
                            String text = run.getText(0);
                            if (text != null) {
                                if (text.contains(stringToBeReplaced)) {
                                    text = text.replace(stringToBeReplaced, stringToBeReplacedWith);
                                    text = text.trim();
                                    run.setText(text, 0);
                                }
                            }
                        }
                    }
                }
            }
        }
        document.write(outputdocxfile);
    } catch (IOException e) {
        LOGGER.error("Could not create outputdocxFile --> IOEXception" + e);
    }
}