2009-08-05 107 views
8

我有一些代碼可以打開Word 2007(docx)文檔並更新相應的CustomXmlPart(因此在文檔本身更新內容控件時會將它們映射到CustomXmlPart),但無法解決如何將其另存爲新文件。當然,它不可能那麼辛苦!保存從模板生成的OpenXML文檔(Word)

我目前的想法是,我需要打開模板並將內容複製到一個新的空白文檔 - 文件逐個文件,當我遇到它時更新CustomXmlPart。 打電話給我老式,但這聽起來有點笨重!

爲什麼我不能只是做一個WordprocessingDocument.SaveAs(文件名); ...?

請告訴我我在這裏錯過了一些簡單的東西。

在此先感謝

+0

我認爲OpenXml應該使東西eaiser - pfft。! 讓我們拭目以待,看看列表中的下一個任務 - 將一些docx文件嵌入到單個docx中(不要問!),我只是在這裏讓自己頭痛! – DilbertDave 2009-08-05 15:45:14

+0

*更容易* ..根據規範手工製作xml;) – JoeBrockhaus 2014-10-07 22:06:42

回答

14

您是否指的是OpenXml SDK?不幸的是,從OpenXml SDK 2.0開始,沒有SaveAs方法。您需要:

  1. 製作模板文件的臨時副本,並將其命名爲任何您想要的名稱。
  2. 對上述文件執行OpenXml更改。
  3. 保存適當的部分(即對主要內容使用。myWordDocument.MainDocumentPart.Document.Save()方法或對特定標頭使用someHeaderPart.Header.Save()方法)。
+6

這就是我最終做的事情 - 對我來說似乎有點遺漏。如果您打開一個文檔並對其進行修改,那麼您可能希望以不同的名稱保存更新的版本。 – DilbertDave 2009-08-21 10:52:03

+1

如果您將文件讀入MemoryStreams正確,可以完成相同的操作嗎?我的意思是避免複製文件。 – 2013-05-09 17:24:30

+0

@PabloRomeo我認爲這可能是可能的,但這不是我在使用OpenXml時嘗試的方法。如果這是您的目標,您可以使用'MemoryStream',最後將其保存到所需的文件名。這些鏈接可能有所幫助:[使用內存中的開放式XML文檔](http://msdn.microsoft.com/zh-cn/library/office/ee945362%28v=office.11​​%29.aspx)和[Trouble with OpenXML和MemoryStreams?](http://amykinsgardiner.blogspot.com/2011/02/trouble-with-openxml-and-memorystreams.html) – 2013-05-09 18:35:55

0

事實上,至少可以在OpenXml SDK 2.5中使用。但是,注意使用原始文件的副本,因爲XML中的更改實際上會反映在文件中。在這裏,你有我的自定義類的方法加載和保存(在刪除一些驗證碼,...):

public void Load(string pathToDocx) 
    { 
     _tempFilePath = CloneFileInTemp(pathToDocx); 
     _document = WordprocessingDocument.Open(_tempFilePath, true); 
     _documentElement = _document.MainDocumentPart.Document; 
    }  

    public void Save(string pathToDocx) 
    { 
     using(FileStream fileStream = new FileStream(pathToDocx, FileMode.Create)) 
     { 
      _document.MainDocumentPart.Document.Save(fileStream); 
     } 
    } 

有「_document」作爲WordprocessingDocument實例。