Microsoft Word 中的 SaveCopyAs 行为
SaveCopyAs behavior in Microsoft Word
众所周知,Word不提供像PowerPoint或Excel那样的SaveCopyAs。我尝试了不同的方法,但没有令人满意的结果。
我能够使用正确的格式(元素定位 -> wdPasteDefault)或正确的样式(字体和颜色 -> wdPasteDefault)即时复制文档。
如果用户关闭原始文档,则必须询问他是否应保存该文档以及 select 路径。
目前我在Word 2016上尝试了不同的方法。最后我想支持2010到2016。
一种方法是:
object wdWhat = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage;
object wdWhich = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToAbsolute;
Microsoft.Office.Interop.Word.Range range = document.Range(ref missObj, ref missObj);
Microsoft.Office.Interop.Word.Range pageRange = document.Range(ref missObj, ref missObj);
pageRange.Start = range.GoTo(ref wdWhat, ref wdWhich, ref missObj, ref missObj).Start;
pageRange.End = document.Range(ref missObj, ref missObj).End;
pageRange.Copy();
Microsoft.Office.Interop.Word.Document newDoc = AddinModule.CurrentInstance.WordApp.Documents.Add(ref missObj, ref missObj, ref missObj, ref missObj);
newDoc.PageSetup.PageWidth = document.PageSetup.PageWidth;
newDoc.PageSetup.PageHeight = document.PageSetup.PageHeight;
AddinModule.CurrentInstance.WordApp.Selection.PasteAndFormat(Microsoft.Office.Interop.Word.WdRecoveryType.wdPasteDefault);
object newDocName = filePath;
newDoc.SaveAs(ref newDocName, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj);
object saveChanges = WdSaveOptions.wdSaveChanges;
((Microsoft.Office.Interop.Word._Document)newDoc).Close(saveChanges, ref missObj, ref missObj);
Marshal.ReleaseComObject(newDoc);
newDoc = null;
IPersistFile 有一个众所周知的解决方案,也许它对你来说足够好:
using System.Runtime.InteropServices.ComTypes;
var f = (IPersistFile)doc;
f.Save("[path]", false);
众所周知,Word不提供像PowerPoint或Excel那样的SaveCopyAs。我尝试了不同的方法,但没有令人满意的结果。
我能够使用正确的格式(元素定位 -> wdPasteDefault)或正确的样式(字体和颜色 -> wdPasteDefault)即时复制文档。
如果用户关闭原始文档,则必须询问他是否应保存该文档以及 select 路径。
目前我在Word 2016上尝试了不同的方法。最后我想支持2010到2016。
一种方法是:
object wdWhat = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage;
object wdWhich = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToAbsolute;
Microsoft.Office.Interop.Word.Range range = document.Range(ref missObj, ref missObj);
Microsoft.Office.Interop.Word.Range pageRange = document.Range(ref missObj, ref missObj);
pageRange.Start = range.GoTo(ref wdWhat, ref wdWhich, ref missObj, ref missObj).Start;
pageRange.End = document.Range(ref missObj, ref missObj).End;
pageRange.Copy();
Microsoft.Office.Interop.Word.Document newDoc = AddinModule.CurrentInstance.WordApp.Documents.Add(ref missObj, ref missObj, ref missObj, ref missObj);
newDoc.PageSetup.PageWidth = document.PageSetup.PageWidth;
newDoc.PageSetup.PageHeight = document.PageSetup.PageHeight;
AddinModule.CurrentInstance.WordApp.Selection.PasteAndFormat(Microsoft.Office.Interop.Word.WdRecoveryType.wdPasteDefault);
object newDocName = filePath;
newDoc.SaveAs(ref newDocName, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj, ref missObj);
object saveChanges = WdSaveOptions.wdSaveChanges;
((Microsoft.Office.Interop.Word._Document)newDoc).Close(saveChanges, ref missObj, ref missObj);
Marshal.ReleaseComObject(newDoc);
newDoc = null;
IPersistFile 有一个众所周知的解决方案,也许它对你来说足够好:
using System.Runtime.InteropServices.ComTypes;
var f = (IPersistFile)doc;
f.Save("[path]", false);