我有一些代码可以打开 Word 2007 (docx) 文档并更新相应的 CustomXmlPart(从而更新文档本身中的内容控件,因为它们映射到 CustomXmlPart),但无法弄清楚如何保存此代码作为一个新文件。!肯定没那么难!
我目前的想法是,我需要打开模板并将内容逐个文件复制到新的空白文档中,并在遇到它时更新 CustomXmlPart。 你可以说我是老派,但这对我来说听起来有点笨拙!
为什么我不能只执行 WordprocessingDocument.SaveAs(filename); ...?
请告诉我我在这里缺少一些简单的东西。
提前致谢
您指的是OpenXml SDK吗?不幸的是,从 OpenXml SDK 2.0 开始,没有 SaveAs 方法。你需要:
myWordDocument.MainDocumentPart.Document.Save()
方法,对特定标题使用 someHeaderPart.Header.Save()
方法)。OpenXml 2.8.1 有一个 SaveAs 方法,似乎可以解决这个问题。
var document = WordprocessingDocument.Open(specificationPath, true);
document.SaveAs("filePath/documentCopy.docx");
编辑:自版本 3.0.2 起,SaveAs() 方法已被删除,而应使用 Clone() 方法:
确实可以,至少在 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 实例。
您可以使用 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());
}
在 Open XML SDK 2.5 中,当 AutoSave 为 true 时,Close 会保存更改。 在这里查看我的回答: https://stackoverflow.com/a/36335092/3285954