2009-08-05 78 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实例。