当前位置: 首页 > 知识库问答 >
问题:

如何使用docx4j插入元素

尉迟国发
2023-03-14

我有一个.docx文档,顶部有一些表格。它们包含需要替换的文本占位符,这很好。但是,这些表中的一个需要重复,并用不同的值填充。我能够深度复制表并将其添加到文档的末尾,但我不知道如何将其插入适当的位置。我尝试在模板表的索引处添加副本,但在LibreOffice中会出现“未知的图形格式”错误,即使删除了原件:

template.getMainDocumentPart().getContent().add(index, copy);
template.getMainDocumentPart().getContent().remove(table);
package test;

import org.docx4j.XmlUtils;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.ContentAccessor;
import org.docx4j.wml.Tbl;
import org.docx4j.wml.Text;

import javax.xml.bind.JAXBElement;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Test {

    private WordprocessingMLPackage template;

    public void getTemplate(String name) {
        try {
            template = WordprocessingMLPackage.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(name));
        } catch (Exception e) {
        }
    }

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

    public void duplicate() {
        List<Object> tables = getAllElementFromObject(template.getMainDocumentPart(), Tbl.class);
        for (Object table : tables) {
            List list = template.getMainDocumentPart().getContent();
        // Workaround for table being wrapped in JAXBElement
        // This simple code assumes table is present and top level
        int index = 0;
        for (Object o : list) {
            if (XmlUtils.unwrap(o)== table) {
                break;
            }
            index++;
        }
        List<Object> texts = getAllElementFromObject(table, Text.class);
        for (Object t : texts) {
            Text text = (Text) t;
            if (text.getValue().contains("second")) {
                Tbl copy = (Tbl) XmlUtils.deepCopy(table);
                template.getMainDocumentPart().getContent().add(index, copy);
                System.out.println(template.getMainDocumentPart().getXML());
                return;                    
            }
        }           }
    }

    public void save() {
        try {
            template.save(new File("out.docx"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.getTemplate("test.docx");
        test.duplicate();
        test.save();
    }

}

我不知道如何最好地处理这件事。

共有1个答案

严天逸
2023-03-14

听起来桌子里可能有图像?你是从另一个docx复制的吗?

如果您只克隆了当前主文档部分的内容,并按照您的问题插入,这将是好的,不会导致您报告的错误。

 类似资料:
  • Word显示图像有问题。我真的不知道问题出在哪里

  • 本文向大家介绍如何使用jQuery将元素插入DOM?,包括了如何使用jQuery将元素插入DOM?的使用技巧和注意事项,需要的朋友参考一下 在某些情况下,您想在现有文档中插入一个或多个新DOM元素。jQuery提供了多种在不同位置插入元素的方法。 after(content)方法将内容插入每个匹配的元素之后,而before(content)方法将内容插入每个匹配的元素之前。 后内容 after(c

  • 在新的DOCX中,我的XML如下所示: 所以我不知道如何将第二行设置到第一行的相同位置?

  • 问题内容: 使用以下语法时,不必为每种类型的属性和事件繁琐地搜索解决方法: 有没有一种方法可以将整个HTML元素声明为字符串?喜欢: 问题答案: 创建片段然后插入该片段可能会更好,而不是直接弄乱它: 好处: 您可以使用本机DOM方法进行插入,例如insertBefore,appendChild等。 您可以在插入实际的DOM节点之前对其进行访问;您可以访问片段的childNodes对象。 使用文档片

  • 问题内容: 我觉得我看到了一种使用CSS content属性在元素之前插入换行标记的方法。显然这是行不通的: 但是你怎么做呢? 问题答案: 可以在伪元素生成的内容中使用 转义序列。。 您可能还需要添加到。 注意:表示一行的结尾。 ps另一种治疗方法是

  • 本文向大家介绍PHP如何使用array_unshift()在数组开头插入元素,包括了PHP如何使用array_unshift()在数组开头插入元素的使用技巧和注意事项,需要的朋友参考一下 PHP array_unshift() 函数用来在数组开头插入一个或多个元素,其语法如下: int array_unshift ( array &$arr , mixed $value1 [, mixed $va