我正在处理Word VSTO加载项。我编写了将一个文档插入另一个文档的代码。我有两种不同的方法。
1)Copy
/ Paste
var app = new Word.Application();
var MyDoc = app.Documents.Add(@"C:\install\CSharp\Plank.dotm");
MyDoc.ActiveWindow.Selection.WholeStory();
MyDoc.ActiveWindow.Selection.CopyFormat();
Word.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
doc.Activate();
doc.ActiveWindow.Selection.PasteFormat();
2)InsertFile()
var app = new Word.Application();
var MyDoc = app.Documents.Add(@"C:\install\CSharp\Plank.dotm");
Word.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
doc.Activate();
//Taking margins
float TopMargin = MyDoc.PageSetup.TopMargin;
float RightMargin = MyDoc.PageSetup.RightMargin;
float LeftMargin = MyDoc.PageSetup.LeftMargin;
Globals.ThisAddIn.Application.Selection.InsertFile(@"C:\\install\CSharp\Plank.dotm", Link: false, Attachment: false);
第一种方法,行PasteFormat()
不起作用,告诉我没有复制文本属性。 (如果我仅使用Copy()
和Paste()
,则可以使用。)即使我手动粘贴也可以获得所需的内容。
第二种方法有效,但是它不需要文本格式。所以我得到的文本格式和大小与原始文本有所不同。
问题是:如何保留原始字体格式?我试图在Word中手动插入文件。而且我也无法在那里获得原始文本格式。也许这是错误的方法?
答案 0 :(得分:1)
我用Copy()
/ Paste()
解决方案解决了这个问题。我需要这样复制:
MyDoc.ActiveWindow.Selection.Copy();
doc.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.wdFormatOriginalFormatting);
然后保留样式。但是有时候,如果文档中有表,它将表复制到下一页,这很奇怪。 InsertFile()
方法不适用于我。
答案 1 :(得分:0)
PasteFormat将仅粘贴格式,而不粘贴内容,应在CopyFormat方法之后使用。应该使用PasteAndFormat方法粘贴具有或不具有WdRecoveryType常量定义的格式的内容。在这里您应该使用:
doc.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.wdFormatOriginalFormatting);
有关更多信息,请阅读PasteAndFormat method和WdRecoveryType constant
答案 2 :(得分:0)
有关该行为的一些背景信息:默认情况下和设计上,Word将使用与 target 文档中定义的相同的 样式 定义,因此(从格式的角度来看)传入的内容是“无缝”合并的。如果传入的内容具有与目标文档中已经存在的相同的样式名称,则传入的内容的格式将更改。
如答案所示,使用Windows剪贴板时,带有参数PasteAndFormat
的{{1}}方法将覆盖默认行为并保留原始格式。
但是,通过剪贴板进行工作并非总是理想或理想的。还有另一种方法,就是更改源文档中的样式名称,以使其与目标文档中的样式名称不同。如果在源文档中一致地使用样式,则此方法将起作用。 (但是,手动应用的格式可能仍然会丢失。)
以下代码段说明了段落样式的方法。它根据文档中使用的样式创建新样式-该新样式与名称完全相同。然后执行查找/替换,用新样式替换样式的所有实例。现在,可以将内容插入到另一个文档中并保留格式。
Word.WdRecoveryType.wdFormatOriginalFormatting