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

问题描述 投票:0回答:5

我有一些代码可以打开 Word 2007 (docx) 文档并更新相应的 CustomXmlPart(从而更新文档本身中的内容控件,因为它们映射到 CustomXmlPart),但无法弄清楚如何保存此代码作为一个新文件。!肯定没那么难!

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

为什么我不能只执行 WordprocessingDocument.SaveAs(filename); ...?

请告诉我我在这里缺少一些简单的东西。

提前致谢

c# ms-word openxml
5个回答
16
投票

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

  1. 制作模板文件的临时副本,将其命名为您想要的任何名称。
  2. 对上述文件执行 OpenXml 更改。
  3. 保存适当的部分(即对主要内容使用 .
    myWordDocument.MainDocumentPart.Document.Save()
    方法,对特定标题使用
    someHeaderPart.Header.Save()
    方法)。

2
投票

OpenXml 2.8.1 有一个 SaveAs 方法,似乎可以解决这个问题。

var document = WordprocessingDocument.Open(specificationPath, true);
document.SaveAs("filePath/documentCopy.docx");

编辑:自版本 3.0.2 起,SaveAs() 方法已被删除,而应使用 Clone() 方法:


1
投票

确实可以,至少在 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 实例。


1
投票

您可以使用 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()); 
}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.