【问题标题】:Saving an OpenXML Document (Word) generated from a template保存从模板生成的 OpenXML 文档 (Word)
【发布时间】:2010-11-17 00:31:11
【问题描述】:

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

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

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

请告诉我我在这里遗漏了一些简单的东西。

提前致谢

【问题讨论】:

  • 我认为 OpenXml 应该让事情变得更简单 - pfft.!暂时把上面的事情放在一边,我看看列表中的下一个任务 - 将少量 docx 文件嵌入到单个 docx 中(不要问!),我只是让自己头疼!
  • 更容易 .. 比根据规范手工制作 xml ;)

标签: c# ms-word openxml


【解决方案1】:

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

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

【讨论】:

  • 这几乎就是我最终所做的——对我来说似乎有点疏忽。如果您打开一个文档并对其进行修改,那么您可能希望使用不同的名称保存更新的版本。
  • 如果您将文件读入 MemoryStreams 是否正确,也可以完成相同的操作?我的意思是避免复制文件。
  • @PabloRomeo 我认为这可能是可行的,但这不是我在使用 OpenXml 时尝试过的方法。您可能可以使用MemoryStream,然后将其保存到最后所需的文件名,如果这是目标的话。这些链接可能会有所帮助:Working with In-Memory Open XML DocumentsTrouble with OpenXML and MemoryStreams?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    至少在 OpenXml SDK 2.5 中确实可以。但是,请注意使用原始文件的副本,因为 XML 中的更改实际上会反映在文件中。这里有我的自定义类的 Load 和 Save 方法(删除一些验证代码后,...):

        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 实例。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-31
        相关资源
        最近更新 更多