我正在使用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的工作)?
任何帮助将不胜感激.
解决方法:
我完全认为您应该沿着将要用表替换的内容控件前后的运行拆分为单独的段落的路径.但是,如果您给Word一个奇怪的运行原因,那只会很容易出错.就像我想要一个新东西一样,它将进行三轮运行,因为在这句话中,what在语法上是不正确的,Word会将其标记为脏,除非/直到您在Word中选择对其进行更正或忽略,否则它将保留三轮运行.那是我唯一可以预见的问题.
但是,如果您有解决此问题的策略(例如,强制用户对他们的文档进行拼写检查),那么其他方法当然是可行的.如果您不熟悉Eric White的博客,那么在Word中使用Open XML SDK进行开发时,它将是您最好的朋友.例如,仅这些文章应该回答您有关如何使用功能转换来解析,插入和替换的大多数/所有问题.
> Processing all Content Parts in an
Open XML WordprocessingML
Document
> Inserting / Deleting / Moving
Paragraphs in Open XML
Wordprocessing Documents
> Splitting Runs in Open XML Word
Processing Document Paragraphs