OpenXML:用 WordprocessingML 中的表格替换 <sdt/> 元素

wil*_*lvv 5 c# openxml openxml-sdk

我正在使用 OpenXML SDK 以编程方式用<w:sdt/>OpenXML (WordProcessingML) 标记块替换一些元素。

例如,我有一个包含以下内容的段落:

<w:p>
  <w:run><w:text> Text before </w:text></w:run>
  <w:sdt><w:sdtPr> ...</w:sdtPr><w:sdtContent>...</w:sdtContent></w:sdt>
  <w:run><w:text> Text after </w:text></w:run>
</w:p>
Run Code Online (Sandbox Code Playgroud)

还有一个结构如下的表:

<w:tbl>
  <w:tblPr>...</w:tblPr>
  <w:tblGrid> ... gridCol elements ...</w:tblGrid>
  <w:tr>
    <w:trPr>...</w:trPr>
    <w:tc>
   <w:tcPr>...</w:tcPr>
   <w:p> Cell contents </w:p>
    </w:tc>
    <w:tc>
   <w:tcPr>...</w:tcPr>
   <w:p> Cell contents </w:p>
    </w:tc>
  </w:tr>
 </w:tbl>
Run Code Online (Sandbox Code Playgroud)

基本上我想<w:sdt/>用表格标记替换段落中的元素。问题是我不能只是替换它,因为它会创建一个无效的文档(另一个段落元素中包含段落的表格无效)。

我想要得到的结果是这样的:

<w:p>
  <w:run><w:text> Text before </w:text></w:run>
</w:p>
<w:tbl>
  <w:tblPr>...</w:tblPr>
  <w:tblGrid> ... gridCol elements ...</w:tblGrid>
  <w:tr>
    <w:trPr>...</w:trPr>
    <w:tc>
   <w:tcPr>...</w:tcPr>
   <w:p> Cell contents </w:p>
    </w:tc>
    <w:tc>
   <w:tcPr>...</w:tcPr>
   <w:p> Cell contents </w:p>
    </w:tc>
  </w:tr>
</w:tbl>
<w:p>
  <w:run><w:text> Text after </w:text></w:run>
</w:p>
Run Code Online (Sandbox Code Playgroud)

我正在考虑创建一种方法,该方法使用元素之前的<w:sdt/>元素创建一个新段落,并使用 sdt 元素之后的元素创建另一个段落,但似乎这样的方法容易出错。

有没有一种方法可以做我想做的事情而不必手动做(当我尝试在文本行中插入新表格时,这种方法可以做 Word 所做的事情)?

任何帮助将不胜感激。

Tod*_*ain 3

我完全认为您应该沿着将要替换为表格的内容控制之前和之后的运行拆分为单独的段落的路径。如果你给Word一个奇怪的运行理由,那么它真的很容易出错。就像“我想要一个新事物”将运行三次,因为“想要”在这句话中在语法上不正确,Word 会将其标记为脏,除非/直到您在 Word 中选择更正它或忽略它,否则它将保持运行三次。这是我预见到的唯一问题。

但是,如果您有一个解决此问题的策略(例如强制用户对其文档进行拼写检查),那么其余的当然是可行的。如果您不熟悉 Eric White 的博客,那么当您在 Word 中使用 Open XML SDK 进行开发时,它将是您最好的朋友。例如,仅这些文章就应该回答您关于如何使用函数转换来解析、插入和替换的大部分/所有问题。

  1. 处理 Open XML WordprocessingML 文档中的所有内容部分
  2. 在 Open XML 字处理文档中插入/删除/移动段落
  3. 拆分 Open XML 字处理文档段落中的运行