テンプレートから生成されたOpenXMLドキュメント(Word)を保存する
質問
Word 2007(docx)ドキュメントを開き、適切なCustomXmlPartを更新するコードが少しあります(したがって、CustomXmlPartにマップされているドキュメント自体のコンテンツコントロールを更新します)これを新しいファイルとして保存してください。!そんなに難しいことはないでしょう!
現在の考えでは、テンプレートを開いて、コンテンツを新しい空のドキュメントにコピーする必要があります-ファイルごとに、遭遇したときにCustomXmlPartを更新します。 昔ながらの私と呼んでも、それは少し不格好に聞こえます!
WordprocessingDocument.SaveAs(filename);を実行できないのはなぜですか。 ...?
ここで簡単なものが不足していることを教えてください。
事前に感謝
解決
OpenXml SDKを参照していますか?残念ながら、OpenXml SDK 2.0の時点では、SaveAsメソッドはありません。必要なこと:
- テンプレートファイルの一時コピーを作成し、必要な名前を付けます。
- 上記のファイルでOpenXmlの変更を実行します。
- 適切なセクションを保存します(つまり、メインコンテンツに。
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());
}