【问题标题】:docx4j - delete wml P elementdocx4j - 删除 wml P 元素
【发布时间】:2015-03-17 13:21:27
【问题描述】:

我正在使用 docx4j 来处理 Microsoft Word 模板。我想知道如何删除或隐藏模板中的 P 元素。我能够遍历代码以获取特定的 P 元素,现在我需要知道如何删除或隐藏该 P 元素。任何人都可以帮忙吗?我使用以下代码获取所有 P 元素:

private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {

    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch))
        result.add(obj); 
    else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }
    return result; 
}

private void replaceTextValue_P(WordprocessingMLPackage template ) throws Exception{        

    List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), P.class);

    // List<Object> pCon = new ArrayList<Object>();

    for (Object text : texts) {         
        P textElement = (P) text;
        template.getMainDocumentPart().getContent().remove(textElement); // DOES NOT WORK!

      writeDocxToStream(template, "C:\\Temp\\Target.docx");
}
}

private void writeDocxToStream(WordprocessingMLPackage template, String target) throws IOException, Docx4JException {

    File f = new File(target);
    template.save(f);
}

【问题讨论】:

    标签: java ms-word docx4j


    【解决方案1】:

    如果要删除P(即textElement instanceof P),只需将其从包含列表中删除即可,即

    template.getMainDocumentPart().getContent().remove(textElement )
    

    但我认为你的意思是删除文本内容。

    同样的方法,即:

    p.getContent().remove(textElement )
    

    看着:

    public void replaceElement(Object current, List insertions) {
        int index = content.indexOf(current);
    
        if (index > -1 ) {          
            content.addAll(index+1, insertions);  
            Object removed = content.remove(index);
    
            // sanity check
            if (!current.equals(removed)) {
                log.error("removed wrong object?");
            }           
        } else {
            // Not found
            log.error("Couldn't find replacement target.");
        }
    } 
    

    如果您传入的Object 当前只与JAXBElement 中包含的内容匹配,则该方法将不起作用。它需要一个小的修复来解决这种情况。

    【讨论】:

    • 我其实是想去掉P元素,而不是删除文字内容。我试过 template.getMainDocumentPart().getContent().remove(textElement);但没有删除 P 元素。我已更新问题以显示这一点并添加了用于保存文档的代码。
    • 由于您的 getAllElementFromObject 递归调用自身,请检查您要删除的 P 元素实际上不在 MainDocumentPart 的内容列表中,例如,不在内容控件中。
    • 我有一个包含多个内容控件的模板。如果我没有要添加到内容控件的文本,那么我想将其删除。否则,创建的文档包含一个空白空间。我该怎么做?
    • 您可以像删除P一样删除内容控件;它只是相关 List 中的一个对象
    • 问题是,我不知道如何删除P元素
    猜你喜欢
    • 1970-01-01
    • 2019-05-22
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多