保存从模板生成的OpenXML文档(Word)

时间:2009-08-05 13:21:05

标签: c# ms-word openxml

我有一些代码可以打开Word 2007(docx)文档并更新相应的CustomXmlPart(因此,当它们映射到CustomXmlPart时更新文档本身的内容控件)但是无法解决如何将其保存为新文件。当然不会那么难!

我目前的想法是,我需要打开模板并将内容复制到一个新的空白文档中 - 逐个文件,在遇到它时更新CustomXmlPart。 叫我老式,但这对我来说听起来有点笨拙!

为什么我不能只做一个WordprocessingDocument.SaveAs(filename); ...?

请告诉我,我在这里错过了一些简单的事情。

提前致谢

4 个答案:

答案 0 :(得分:14)

您指的是OpenXml SDK吗?不幸的是,从OpenXml SDK 2.0开始,没有SaveAs方法。你需要:

  1. 制作模板文件的临时副本,并根据需要命名。
  2. 对上述文件执行OpenXml更改。
  3. 保存适当的部分(例如,使用。myWordDocument.MainDocumentPart.Document.Save()方法作为主要内容,或使用someHeaderPart.Header.Save()方法作为特定标题。

答案 1 :(得分: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 实例。

答案 2 :(得分:0)

在Open XML SDK 2.5中,当AutoSave为true时,关闭保存更改。 在这里看到我的答案: https://stackoverflow.com/a/36335092/3285954

答案 3 :(得分:0)

您可以使用MemoryStream来编写更改,而不是在原始文件中。因此,您可以将该MemoryStream保存到新文件:

byte[] byteArray = File.ReadAllBytes("c:\\temp\\mytemplate.docx");
using (var stream = new MemoryStream())
{
    stream.Write(byteArray, 0, byteArray.Length);
    using (var wordDoc = WordprocessingDocument.Open(stream, true))
    {
       // Do work here
       // ...
       wordDoc.MainDocumentPart.Document.Save(); // won't update the original file 
    }
    // Save the file with the new name
    stream.Position = 0;
    File.WriteAllBytes("C:\\temp\\newFile.docx", stream.ToArray()); 
}