11

在我们旧的基于 MSWord-97 的系统中,我们使用 COM 与 .doc 文件交互,并嵌入一个 OLE 对象,因此嵌入的文档在父级中可见(而不是作为图标)。

我们将其替换为使用 OpenXML SDK 的系统,因为它需要在我们的服务器上安装 Word,它会生成 .docx 文件。但是我们仍然需要将 RTF 文件的内容嵌入到生成的 DOCX 中……特别是我们用文件的内容替换书签。

我在网上找到了一些例子,但它们都不同。当我在 Word 中创建一个简单的示例并查看 XML 时,有很多东西可以定位/显示嵌入对象的视觉表示,而嵌入本身似乎并不太可怕。最简单的方法是什么?

4

2 回答 2

12

您可以使用外部内容的锚点将RTF文档的内容嵌入到 OpenXMLDOCX文件中。( ) 元素指定 OpenXML WordprocessingML 文档中AltChunk的一个位置,用于插入外部内容,例如文档。下面的代码使用该类与该类结合将文档的内容嵌入到最后一段之后的文件中: AltChunkw:altChunkRTFAltChunkAlternativeFormatImportPartRTFDOCX

using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(@"your_docx_file.docx", true))
{
  string altChunkId = "AltChunkId5";

  MainDocumentPart mainDocPart = wordDocument.MainDocumentPart;
  AlternativeFormatImportPart chunk = mainDocPart.AddAlternativeFormatImportPart(
        AlternativeFormatImportPartType.Rtf, altChunkId);      

  // Read RTF document content.
  string rtfDocumentContent = File.ReadAllText("your_rtf_document.rtf", Encoding.ASCII);

  using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(rtfDocumentContent)))
  {
    chunk.FeedData(ms);
  }

  AltChunk altChunk = new AltChunk();
  altChunk.Id = altChunkId;

  // Embed AltChunk after the last paragraph.
  mainDocPart.Document.Body.InsertAfter(
    altChunk, mainDocPart.Document.Body.Elements<Paragraph>().Last());

  mainDocPart.Document.Save();
}

如果要将 UnicodeRTF字符串嵌入到DOCX文件中,则必须转义 Unicode 字符。有关示例,请参阅以下stackoverflow 答案

当您遇到错误“文件已损坏”时,请确保您Dispose()或. 如果您不关闭()该文档,则该文档的关系不会存储在Document.xml.rels文件中。Close()WordprocessingDocumentw:altchunk

于 2013-12-01T13:22:22.637 回答
0

这个家伙似乎已经用他自己的问题和答案解决了这个问题,我如何使用 OpenXml 2.0 将任何文件类型嵌入 Microsoft Word

于 2010-07-30T07:14:49.683 回答