Сохранение документа OpenXML (Word), созданного из шаблона - PullRequest
9 голосов
/ 05 августа 2009

У меня есть немного кода, который откроет документ Word 2007 (docx) и обновит соответствующий CustomXmlPart (таким образом, обновляя элементы управления содержимым в самом документе, поскольку они сопоставлены с CustomXmlPart), но не могу понять, как сохраните это как новый файл.! Конечно, это не может быть так сложно!

В настоящее время я думаю, что мне нужно открыть шаблон и скопировать содержимое в новый пустой документ - файл за файлом, обновляя CustomXmlPart, когда я сталкиваюсь с ним. Назовите меня старомодным, но это звучит немного неуклюже для меня!

Почему я не могу просто сделать WordprocessingDocument.SaveAs (имя файла); ...

Пожалуйста, скажите мне, что я упускаю что-то простое здесь.

Заранее спасибо

Ответы [ 4 ]

14 голосов
/ 20 августа 2009

Вы имеете в виду OpenXml SDK? К сожалению, в OpenXml SDK 2.0 нет метода SaveAs. Вам нужно:

  1. Сделайте временную копию вашего файла шаблона, назвав его как хотите.
  2. Выполните изменения OpenXml для вышеуказанного файла.
  3. Сохраните соответствующие разделы (т. Е. Используйте метод. myWordDocument.MainDocumentPart.Document.Save() для основного содержимого или метод someHeaderPart.Header.Save() для определенного заголовка).
0 голосов
/ 29 мая 2018

Вы можете использовать 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 голосов
/ 31 марта 2016

В Open XML SDK 2.5 Close сохраняет изменения, когда AutoSave установлен в true. Смотрите мой ответ здесь: https://stackoverflow.com/a/36335092/3285954

0 голосов
/ 18 марта 2016

Действительно, вы можете, по крайней мере, в 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 .

...