テンプレートから生成されたOpenXMLドキュメント(Word)を保存する

StackOverflow https://stackoverflow.com/questions/1233228

  •  22-07-2019
  •  | 
  •  

質問

Word 2007(docx)ドキュメントを開き、適切なCustomXmlPartを更新するコードが少しあります(したがって、CustomXmlPartにマップされているドキュメント自体のコンテンツコントロールを更新します)これを新しいファイルとして保存してください。!そんなに難しいことはないでしょう!

現在の考えでは、テンプレートを開いて、コンテンツを新しい空のドキュメントにコピーする必要があります-ファイルごとに、遭遇したときにCustomXmlPartを更新します。 昔ながらの私と呼んでも、それは少し不格好に聞こえます!

WordprocessingDocument.SaveAs(filename);を実行できないのはなぜですか。 ...?

ここで簡単なものが不足していることを教えてください。

事前に感謝

役に立ちましたか?

解決

OpenXml SDKを参照していますか?残念ながら、OpenXml SDK 2.0の時点では、SaveAsメソッドはありません。必要なこと:

  1. テンプレートファイルの一時コピーを作成し、必要な名前を付けます。
  2. 上記のファイルでOpenXmlの変更を実行します。
  3. 適切なセクションを保存します(つまり、メインコンテンツに。 myWordDocument.MainDocumentPart.Document.Save()メソッドを使用するか、 someHeaderPart.Header.Save()メソッドを使用します特定のヘッダー用)。

他のヒント

確かに、少なくとも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 インスタンスとして。

Open XML SDK 2.5 Closeでは、自動保存がtrueの場合に変更を保存します。 ここで私の答えを参照してください: https://stackoverflow.com/a/36335092/3285954

元のファイルではなく、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()); 
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top