将Word文档中的书签替换为另一个Word文档的内容
本文关键字:文档 Word 另一个 书签 替换 | 更新日期: 2023-09-27 18:14:03
我想用另一个word文档的全部内容替换word文档中的书签。我希望按照下面的方式做一些事情,但是追加xml似乎还不够,因为它不包括图片。
using Word = Microsoft.Office.Interop.Word;
...
Word.Application wordApp = new Word.Application();
Word.Document doc = wordApp.Documents.Add(filename);
var bookmark = doc.Bookmarks.OfType<Bookmark>().First();
var doc2 = wordApp.Documents.Add(filename2);
bookmark.Range.InsertXML(doc2.Contents.XML);
第二个文档包含一些图像和一些文本表格。
更新:使用XML取得了进展,但仍然不满足添加图片
你跳得太深了。
如果你正在使用对象模型(bookmark.Range
)并试图插入图片,你可以使用剪贴板或bookmark.Range.InlineShapes.AddPicture(...)
。如果你想插入整个文档,你可以复制/粘贴第二个文档:
Object objUnit = Word.WdUnits.wdStory;
wordApp.Selection.EndKey(ref objUnit, ref oMissing);
wordApp.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.wdPasteDefault);
如果您使用的是XML,则可能存在其他问题,例如格式、图像、页眉/页脚不能正确输入。
根据任务的不同,使用DocumentBuilder和OpenXML SDK可能会更好。如果你正在编写Word插件,你可以使用对象API,它可能会执行相同的操作,如果你没有Word处理文档,请使用OpenXML SDK和DocumentBuilder。DocumentBuilder的问题是,如果它不工作,没有很多变通办法可以尝试。它是开源的,不是最干净的代码,如果你试着排除它。
您可以使用openxml SDK和Document builder来完成此操作。下面是你需要的内容
1>在主文档中插入键
public WmlDocument GetProcessedTemplate(string templatePath, string insertKey)
{
WmlDocument templateDoc = new WmlDocument(templatePath);
using (MemoryStream mem = new MemoryStream())
{
mem.Write(templateDoc.DocumentByteArray, 0, templateDoc.DocumentByteArray.Length);
using (WordprocessingDocument doc = WordprocessingDocument.Open([source], true))
{
XDocument xDoc = doc.MainDocumentPart.GetXDocument();
XElement bookMarkPara = [get bookmarkPara to replace];
bookMarkPara.ReplaceWith(new XElement(PtOpenXml.Insert, new XAttribute("Id", insertKey)));
doc.MainDocumentPart.PutXDocument();
}
templateDoc.DocumentByteArray = mem.ToArray();
}
return templateDoc;
}
2>使用文档生成器合并
List<Source> documentSources = new List<Source>();
var insertKey = "INSERT_HERE_1";
var processedTemplate = GetProcessedTemplate([docPath], insertKey);
documentSources.Add(new Source(processedTemplate, true));
documentSources.Add(new Source(new WmlDocument([docToInsertFilePath]), insertKey));
DocumentBuilder.BuildDocument(documentSources, [outputFilePath]);