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

如何在表docx4j中以编程方式绑定repeater?

令狐阳秋
2023-03-14

我知道Opendope的事。当我以编程方式创建用repeater标记包装的段落时,这是可以的。当我尝试创建用表包装的repeater tr时,它抛出

org.docx4j.openpackaging.exceptions.Docx4JException: Problems applying bindings

at org.docx4j.model.datastorage.BindingTraverserXSLT.traverseToBind(BindingTraverserXSLT.java:237)
at org.docx4j.model.datastorage.BindingHandler.applyBindings(BindingHandler.java:292)
at org.docx4j.model.datastorage.BindingHandler.applyBindings(BindingHandler.java:216)
at org.docx4j.Docx4J.bind(Docx4J.java:554)

但是,当我保存文档,然后用docx4j.load()加载,然后绑定时,工作很好。

XMLutils中出现编辑问题。tr的DeepCopy sdtContent变为空

/*
         * Losing content here?
         * 
         * First, make absolutely sure that what you have is valid.
         * 
<w:tbl xmlns:dsp="http://schemas.microsoft.com/office/drawing/2008/diagram" xmlns:cppr="http://schemas.microsoft.com/office/2006/coverPageProps" xmlns:odx="http://opendope.org/xpaths" xmlns:c14="http://schemas.microsoft.com/office/drawing/2007/8/2/chart" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:odgm="http://opendope.org/SmartArt/DataHierarchy" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:we="http://schemas.microsoft.com/office/webextensions/webextension/2010/11" xmlns:pvml="urn:schemas-microsoft-com:office:powerpoint" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:comp="http://schemas.openxmlformats.org/drawingml/2006/compatibility" xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:xvml="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:oda="http://opendope.org/answers" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:odc="http://opendope.org/conditions" xmlns:cdr="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:odi="http://opendope.org/components" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:lc="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:odq="http://opendope.org/questions" xmlns:wetp="http://schemas.microsoft.com/office/webextensions/taskpanes/2010/11" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid">
<w:tblPr>
    <w:tblStyle w:val="TableGrid"/>
    <w:tblW w:w="0" w:type="auto"/>
    <w:tblLook w:val="04A0"/>
</w:tblPr>
<w:tblGrid>
    <w:gridCol w:w="100"/>
</w:tblGrid>
<w:tr>
    <w:tc>
        <w:tcPr>
            <w:tcW w:w="100" w:type="dxa"/>
        </w:tcPr>
        <w:p/>
    </w:tc>
</w:tr>
<w:sdt>
    <w:sdtPr>
        <w:alias w:val="Repeat"/>
        <w:tag w:val="od:repeat=x1"/>
        <w:id w:val="2058423626"/>
    </w:sdtPr>
    <w:sdtContent>
        <w:tr>
            <w:sdt>
                <w:sdtPr>
                    <w:alias w:val=""/>
                    <w:tag w:val="od:xpath=x0"/>
                    <w:id w:val="947420646"/>
                    <w:dataBinding w:xpath="/invoice[1]/items/item[1]/name" w:storeItemID="{bb8f553d-dc92-4c50-b1cb-06e77bbe149a}"/>
                </w:sdtPr>
                <w:sdtContent>
                    <w:tc>
                        <w:p/>
                    </w:tc>
                </w:sdtContent>
            </w:sdt>
        </w:tr>
    </w:sdtContent>
</w:sdt>

共有1个答案

司凡
2023-03-14

在JAXB中,内容控件有不同的Java对象,这取决于它们是包装块级、行级、单元格级还是运行级内容。这些对象都实现接口SDTelement。

类似地,SdtContent有不同的Java对象,这取决于它们是包装块级、行级、单元格级还是运行级内容。这些对象都扩展了SDTContent。

您必须使用正确的对象,否则正如您所注意到的,deepCopy将无法工作。

public class ContentControlFactory {
    ObjectFactory wmlObjectFactory = getWmlObjectFactory();

    public SdtPr createSdtPr(CTDataBinding dataBinding, String tag, String alias) {
        SdtPr sdtPr = createSdtPr(tag, alias);
        sdtPr.setDataBinding(dataBinding);

        return sdtPr;
    }

    public SdtPr createSdtPr(String tag, String alias) {
        Tag t = new Tag();

        SdtPr.Alias a = new SdtPr.Alias();
        a.setVal(alias);
        t.setVal(tag);
        SdtPr sdtPr = wmlObjectFactory.createSdtPr();
        sdtPr.getRPrOrAliasOrLock().add(a);
        sdtPr.setTag(t);

        sdtPr.setId();
        return sdtPr;
    }

    public SdtElement createRepeaterControl(Xpaths.Xpath repeaterXpath, Xpaths.Xpath xpath, Object template) {

        return createSdt(
                createSdtPr("od:repeat=" + repeaterXpath.getId(), "Repeat"),
                createSdtContent(createContentControl(xpath, template))
        );
    }

    public SdtElement createRepeaterControl(Xpaths.Xpath repeaterXpath, Object template) {
        return createSdt(
                createSdtPr("od:repeat=" + repeaterXpath.getId(), "Repeat"),
                createSdtContent(template)
        );
    }

    public SdtElement createContentControl(Xpaths.Xpath xpath, Object template) {
        return createSdt(
                createSdtPr(
                        createDataBinding(xpath.getDataBinding().getXpath(), xpath.getDataBinding().getStoreItemID()),
                        "od:xpath=" + xpath.getId(), ""),
                createSdtContent(template));
    }

    public SdtContent createSdtContent(Object template) {

        System.out.println(template.getClass().getName() );
        SdtContent sdtContent = null; 
        if (template instanceof Tr) {
            sdtContent = wmlObjectFactory.createCTSdtContentRow();
        } else {
            sdtContent = wmlObjectFactory.createSdtContentBlock();

        }

        sdtContent.getContent().add(template);
        return sdtContent;
    }

    public SdtElement createConditionControl(Condition condition, Object template) {
        return createSdt(
                createSdtPr("od:condition=" + condition.getId(), ""),
                createSdtContent(template)
        );
    }

    public SdtElement createSdt(SdtPr sdtPr, SdtContent sdtContent) {
        SdtElement sdtElement = null;

        if (sdtContent instanceof CTSdtContentRow) {
            sdtElement = wmlObjectFactory.createCTSdtRow();
        } else {
            sdtElement = wmlObjectFactory.createSdtBlock();

        }

        sdtElement.setSdtPr(sdtPr);
        sdtElement.setSdtContent(sdtContent);

        return sdtElement;
    }

    public CTDataBinding createDataBinding(String xPath, String storeItemID) {
        CTDataBinding dataBinding = wmlObjectFactory.createCTDataBinding();
        dataBinding.setXpath(xPath);//xPath - это строка с XPath до XML-элемента, связанного с этим Content Control
        dataBinding.setStoreItemID(storeItemID);//storeItemID - это ID корневого XML-элемента, из которого нужно брать данные
        return dataBinding;
    }

}
 类似资料:
  • 问题内容: 我需要使用python编辑Excel工作簿。有没有这样做的方法,而无需阅读工作簿,编辑我想要的内容并将其写回?即有没有一种方法可以即时进行,因为我只需要在每张纸上编辑几个值? 我已经看过了,和,但他们似乎只支持(据我可以工作),阅读和写作不是编辑。我无法使用,因为我正在使用linux。 对库或特定的工作方式有何建议? 问题答案: xlutils有一个复制模块,可能会与您交错

  • 我使用DOCX4J,我有docx与template for table,该模板包含将被替换的变量。 可以有几种类型,每种类型中都有许多引用。类型从来没有任何数量。 因此,首先,我想动态添加更多的单元格和列,然后用好的值绑定变量(值存储在TreeModel(DefaultTreeModel)中)。有办法做到这一点?可能会操纵我的docx的XML?我想保留模板的样式

  • 问题内容: 我们有一个普通的独立spring应用程序,需要将jdbc数据源放在jndi中。(我们使用jboss treecache,它需要数据源位于jndi中)。 一些谷歌搜索人员发现了大多数使用Spring的jndi查找示例,其中已经在jndi中放置了一个对象(通过tomcat或应用服务器等),但是我们需要另外的方法:我有一个简单的数据源Spring bean,我将其注入到其他服务中,但我无法将

  • 问题内容: 我正在尝试为我的应用程序创建一个帐户,在该帐户中我可以与我的帐户建立联系,例如facebook,viber,whatsapp等。我也希望我的帐户在设置的“帐户”部分中可见。有任何想法吗?我已经在Google上搜索了很多,但是找不到正确的答案从哪里开始。请帮忙。我试图创建一个帐户如下。这导致我出错。 问题答案: 您需要设置多个组件才能以编程方式创建一个帐户。你需要: AccountAut

  • 我想在时钟到达特定时间之前中止我的Jenkins作业。我没有找到任何在指定时间自动停止它的东西(我不想手动执行)。有这样的事情吗? 我读过这篇文章,但没有一个答案能解决我的问题:如何在不重启服务器的情况下停止Jenkins上无法阻止的僵尸工作?

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow的主题。 2年前关闭。 改善这个问题 我需要使用python编辑Excel工作簿。有没有这样做的方法,而无需阅读工作簿,编辑我想要的内容并将其写回?即有没有一种方法可以即时进行,因为我只需要在每张纸上编辑几个值? 我已经看过了,和,但他们似乎只支持(据我可以工作),阅