我正在生成Word(.docx)文档,并遇到如何在已经存在的文档中插入图表,图像而不是自定义标记的问题。但最初我使用“Altchunk”方法从几个.RTF文件创建文档,将.RTFs插入到模板doc中的内容控件中。那些.RTF文件包含我们的自定义标签,它们看起来像“< ElementType =”Diagram“Name =”Somename“>”并使用如下所示的新行显示在文档中。(我们事先不知道这些标记将在doc中有多少) .......
< ElementType =“Diagram”Name =“图表的某些名称”>
....... 谷歌搜索它,但无法找到如何用图像替换标签的好方法。 因为首先我需要读取标签以便识别图像的名称,所以我知道将使用什么图像而不是标签,然后从文档中删除标签(只是文本)并在其位置放置我刚刚获取的图像,知道名称图像。所以这很复杂,但我希望有人有好主意分享。感谢
我想更具体地描述这个问题:
1)关于 altchunk 方法,我只是找到我用作模板的word文档中的内容控件,当我有rtf字符串时,我在该CC之后插入altchunk。
我的方法如下所示:
private void ReplaceContentControlWithRTF(MainDocumentPart mainPart, string tagName, string rtfString)
{
SdtBlock sb = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName).Single();
string altChunkId = "altChunkId" + altChunkIdNumber++;
AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Rtf, altChunkId);
MemoryStream s = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(rtfString));
chunk.FeedData(s);
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
DocumentFormat.OpenXml.OpenXmlElement parent = sb.Parent;
parent.InsertAfter(altChunk, sb);
sb.Remove();
mainPart.Document.Save();
}
答案 0 :(得分:1)
我的回答很长,所以我会将内容与一些标题分开,以便更容易阅读:)。除非你已经找到了更好的方法,否则你应该考虑每一个。
连接文件
我认为当你使用 altchunk 方法时,你会得到第一个文档的xml(原始文档),并且所有附加文档都被编码。 更好的方法是连接文档的内容,因为您可以轻松访问整个文档的xml树。如果你不在连续文档中使用图像,超链接等,这很容易,因为它们需要以特殊的方式处理,并且可以使它更复杂。
或者,您可以尝试在连接文档之前将图像插入到每个文档中。
将内容控制用作文档中的占位符
现在,假设您已经可以访问文档,您应该将内容控件放在Word文档中,在希望显示图像的位置,并将每个图像的标记设置为您应该搜索的值在您的代码中,以找到插入图片的正确位置。您可以在此处找到有关内容控制的一些基本信息:http://office.microsoft.com/en-us/help/content-controls-HA010030750.aspx。
插入XML标记和图像的字节
为了将图像插入文档,您不仅要在希望图像显示的位置插入一些XML标记,还要将包含图像的字节添加为ImagePart
。我找到了一个教程解释如何在这里做(虽然我没有自己跟着它):
http://msdn.microsoft.com/en-us/library/ee342530%28v=office.12%29.aspx
考虑使用OpenXML SDK 2.0生产力工具
为了让您更轻松地使用OpenXML SDK,我建议您使用Microsoft的SDK Productivity Tool。它可以作为OpenXML SDK的一部分进行下载,它允许您打开任何MS Office OpenXML文档,以XML方式显示其内容,甚至可以显示重新创建它所需的C#代码。您可以从此处下载:http://www.microsoft.com/download/en/details.aspx?id=5124。
如果您有任何其他问题,请随时询问:)。