我有一些代码可以打开Word 2007(docx)文档并更新相应的CustomXmlPart(因此,当它们映射到CustomXmlPart时更新文档本身的内容控件)但是无法解决如何将其保存为新文件。当然不会那么难!
我目前的想法是,我需要打开模板并将内容复制到一个新的空白文档中 - 逐个文件,在遇到它时更新CustomXmlPart。 叫我老式,但这对我来说听起来有点笨拙!
为什么我不能只做一个WordprocessingDocument.SaveAs(filename); ...?
请告诉我,我在这里错过了一些简单的事情。
提前致谢
答案 0 :(得分:14)
您指的是OpenXml SDK吗?不幸的是,从OpenXml SDK 2.0开始,没有SaveAs方法。你需要:
myWordDocument.MainDocumentPart.Document.Save()
方法作为主要内容,或使用someHeaderPart.Header.Save()
方法作为特定标题。答案 1 :(得分:0)
确实,您至少可以在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 实例。
答案 2 :(得分:0)
在Open XML SDK 2.5中,当AutoSave为true时,关闭保存更改。 在这里看到我的答案: https://stackoverflow.com/a/36335092/3285954
答案 3 :(得分:0)
您可以使用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());
}