2

我使用AltChunk对象将数据从docx文件复制到另一个文件中的富文本内容控件。副本工作正常。但是现在内容控件不能转换为SdtElementOpenXml 中的 a 或ContentControlVSTO 中的 a。

这是我使用的代码

SdtElement sdtElement = destinationdocument.MainDocumentPart.Document.Body.Descendants<SdtElement>().Where(b => b.SdtProperties.GetFirstChild<Tag>() != null).FirstOrDefault();
string altChunkId = "AltChunkId" + Guid.NewGuid().ToString();
AlternativeFormatImportPart chunk = destinationdocument.MainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImport    PartType.WordprocessingML, altChunkId);
chunk.FeedData(File.Open("sourceFile", FileMode.OpenOrCreate));
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
sdtElement.RemoveAllChildren();
sdtElement.Append(altChunk);

第一次代码工作正常。但是在第二次运行时,第一行抛出了一个无法转换的异常。在客户端使用 VSTO 时会出现同样的问题,该ContentControl对象无法保存AltChunk插入的内容控件。不知何故,此过程破坏了富文本内容控件。

有什么我做错了吗?还是有更好的选择?

4

1 回答 1

2

wordDocument.MainDocumentPart.Document.Body.Descendants<SdtElement>()返回IEnumerable<SdtElement>,您将其分配给SdtElemtnt. 尝试使用var或实际返回类型。

更新:

您的代码是有效的。你做错的是这条线sdtElement.RemoveAllChildren();

一个 sdt 元素(内容控件)包含其他元素,如 sdtPr(内容控件属性)、sdtContent(内容控件内的实际内容)等,如下所示。

 <w:sdt>
    <w:sdtPr>
        ...
    </w:sdtPr>
    <w:sdtContent>
      ....
    </w:sdtContent>
  </w:sdt>

sdtElement.RemoveAllChildren();所做的是删除 sdt 元素内的所有内容并将它们替换为:

<w:sdt>
   <w:altChunk r:id="AltChunkIdffebf242-30b3-4905-bf39-fc0077be9474" />
</w:sdt>

这使您的程序在第二次运行时抛出异常,因为destinationdocument.MainDocumentPart.Document.Body.Descendants<SdtElement>().Where(b => b.SdtProperties.GetFirstChild<Tag>() != null).FirstOrDefault();您替换的文档 sdt 元素有 noSdtProperties和 no Tagor sdtContent

要解决此问题,请尝试将您的 altchunk 块插入内容控制内容元素 ( sdtContent) 而不是直接插入 sdt 元素,如下所示:

using (
    FileStream fileStream = File.Open("file.docx",
                                        FileMode.Open))
{
    chunk.FeedData(fileStream);
    AltChunk altChunk = new AltChunk();
    altChunk.Id = altChunkId;
    //sdtElement.RemoveAllChildren();
    sdtElement.Elements<SdtContentBlock>().FirstOrDefault().Append(altChunk); // This is going to add to the existing content.
}

希望这可以帮助!

于 2013-02-12T11:38:18.900 回答