Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Docx4j以编程方式添加w:sdt内容控制_Java_Ms Word_Openxml_Docx_Docx4j - Fatal编程技术网

Java Docx4j以编程方式添加w:sdt内容控制

Java Docx4j以编程方式添加w:sdt内容控制,java,ms-word,openxml,docx,docx4j,Java,Ms Word,Openxml,Docx,Docx4j,我正在构建一个小型java程序来测试docx4j所需的所有“文档相关”特性,以满足我的项目需求。摘要:能够创建带有“内容控件”的模板,这些模板将作为“原始模板”提供给用户。让用户增强它们,最终用数据填充它们。我之所以使用“docx4j”,是因为它具有“重复和有条件”的特性 这是我的进度,以编程方式: 1) 创建空白文档(完成) 2) 添加带有xml数据的自定义xml部件(发票示例中的part3.xml)。(已完成) 3) 添加带有xml xpaths引用的自定义xml部件(发票示例中的part4

我正在构建一个小型java程序来测试docx4j所需的所有“文档相关”特性,以满足我的项目需求。摘要:能够创建带有“内容控件”的模板,这些模板将作为“原始模板”提供给用户。让用户增强它们,最终用数据填充它们。我之所以使用“docx4j”,是因为它具有“重复和有条件”的特性

这是我的进度,以编程方式:

1) 创建空白文档(完成)

2) 添加带有xml数据的自定义xml部件(发票示例中的part3.xml)。(已完成)

3) 添加带有xml xpaths引用的自定义xml部件(发票示例中的part4.xml)。(已完成)

4) 添加内容控件(挂起)

它必须类似于发票示例中的摘录:

<w:sdt>
  <w:sdtPr>
    <w:alias w:val="Customer name" />
    <w:tag w:val="od:xpath=x1&customer name=customer name" />
    <w:id w:val="1418037941" />
    <w:placeholder>
      <w:docPart w:val="DefaultPlaceholder_22675703" />
    </w:placeholder>
    <w:dataBinding w:xpath="/invoice[1]/customer[1]/name[1]" w:storeItemID="{8B049945-9DFE-4726-9DE9-CF5691E53858}" />
    <w:text />
  </w:sdtPr>
  <w:sdtContent>
    <w:p>
      <w:r>
        <w:t>Joe Bloggs</w:t>
     </w:r>
    </w:p>
  </w:sdtContent>
</w:sdt>

乔·布洛格斯
我的问题是:如何生成这个xml?可以通过Java代码或仅通过Word完成?“1418037941”和“DefaultPlaceholder_22675703”值是什么以及如何生成的?我想我不能“发明”它们,而是在其他地方被引用。 我在MainDocumentPart类中寻找某个方法来执行此操作,但找不到它。 我是不是误解了什么

其他步骤对我来说几乎没有问题:

5) 执行“预处理”(完成)

6) 执行“过程”(完成)

7) 执行“剥离”(完成,移除repat标签除外)

非常感谢你的帮助!
David

您当然可以使用docx4j以编程方式创建内容控件。也就是说,创建“模板”的常用方法是使用创作工具,例如

要回答您的具体问题:-

  • 您可以省略w:占位符

  • 规范说w:id是xsd:int类型,是介于 -2147483648和2147483647。您可以随机生成它,也可以忽略它


感谢您的回复。我应该调用哪个方法将生成的xml添加到document.xml中?我尝试过“wordMLPackage.getMainDocumentPart().addAltChunk(AltChunkType.Xml,…”),但这会破坏word文档…假设您有一个JAXB sdt对象(位于org.docx4j.wml命名空间中),您可以使用wordMLPackage.getMainDocumentPart().getContent().add。如果您有一个XML字符串,则需要首先使用XmlUtils.unmarshalStringI将其转换为JAXB对象。生成时,嵌套的。。。标记是可以的,但是嵌套的标记Joe Bloggs看起来是空的,如。当我在Word中打开docx时,内容控件就在那里,但缺少“默认文本”Joe Bloggs。再次感谢。完成后,我将在这里发布我的“实验”:-DIf您想知道为什么sdtContent元素是空的,也许您可以创建一个新问题并发布代码。但通常,如果您添加了无效的内容,则可能会发生这种情况。