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

时间:2012-10-15 20:51:26

标签: java ms-word openxml docx docx4j

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

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

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

2)使用xml数据添加自定义xml部件(发票示例中的part3.xml)。 (DONE)

3)使用xml xpaths引用添加自定义xml部件(发票示例中的part4.xml)。 (DONE)

4)添加内容控件(PENDING)

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

<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)执行“strip”(DONE,删除repat标签除外)

非常感谢你的帮助! 大卫

1 个答案:

答案 0 :(得分:2)

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

回答您的具体问题: -

  • 您可以省略w:占位符。

  • 规范说w:id是类型xsd:int,是一个整数 -2147483648和2147483647.您可以随机生成它,或者may be able也可以将其遗漏。