OpenXML:将<sdt>元素替换为WordprocessingML </sdt>中的表

时间:2010-07-15 00:52:10

标签: c# openxml-sdk openxml

我正在使用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>

一个结构如下的表:

<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: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>

我在考虑创建一个方法,用<w:sdt/>元素之前的元素创建一个新段落,另一个用sdt元素之后的元素创建,但看起来这样的方法容易出错

是否有一种方法可以完成我想要的操作而无需手动执行(当我尝试在文本行中插入新表时,Word执行的操作的方法)?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我完全认为你应该沿着将要用表替换的内容控制之前和之后的运行拆分成单独的段落。如果你让Word有理由进行奇怪的运行,那么它只是非常容易出错。就像我想要一个新东西将是三次运行,因为想要在这句话中语法不正确并且Word会将其标记为脏并且除非/直到您在Word中选择更正它或者忽略它,它将保持三次运行。这是我预见的唯一问题。

但是,如果你有一个策略(比如强迫用户拼写检查他们的文档),剩下的肯定是可行的。如果您不熟悉Eric White的博客,那么在使用Word中的Open XML SDK进行开发时,它将是您最好的朋友。例如,单独这些文章应该回答大部分/全部关于如何使用功能转换来解析,插入和替换的问题。

  1. Processing all Content Parts in an Open XML WordprocessingML Document
  2. Inserting / Deleting / Moving Paragraphs in Open XML Wordprocessing Documents
  3. Splitting Runs in Open XML Word Processing Document Paragraphs