2013-05-17 150 views
1

我正在尋找用另一個word文檔的整個內容替換word文檔中的書籤。我希望按照以下方法做一些事情,但添加xml似乎不夠,因爲它不包含圖片。用另一個word文檔的內容替換Word文檔中的書籤

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做出,但仍然不能滿足添加圖片爲好。

+0

「沒有這樣的運氣」是什麼意思? 「 – tnw

+0

」書籤的範圍是只讀的。「所以我不知道如何設置內容。 – Khan

+1

如何複製+粘貼文檔內容粘貼到書籤...這將工作... –

回答

1

你深陷已經躍升。

如果您使用的是對象模型(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的問題是,如果它不起作用,那麼沒有太多的解決方法可以嘗試。如果您嘗試對其進行故障排除,那麼它不是最簡潔的代碼。

0

您可以使用openxml SDK和文檔生成器完成此操作。大綱這裏是你需要什麼

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]); 
相關問題