Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将一个文档插入另一个Microsoft.Office.Interop.Word_C#_Ms Word_Office Interop - Fatal编程技术网

C# 将一个文档插入另一个Microsoft.Office.Interop.Word

C# 将一个文档插入另一个Microsoft.Office.Interop.Word,c#,ms-word,office-interop,C#,Ms Word,Office Interop,我正在处理要添加的单词。我编写了一个代码,将一个文档插入到另一个文档中。我有两种不同的方法 1) 复制/粘贴 var app = new Word.Application(); var MyDoc = app.Documents.Add(@"C:\install\CSharp\Plank.dotm"); MyDoc.ActiveWindow.Selection.WholeStory(); MyDoc.ActiveWindow

我正在处理要添加的单词。我编写了一个代码,将一个文档插入到另一个文档中。我有两种不同的方法

1)
复制
/
粘贴

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()

在第一种方法中,
PasteFormat()
行不起作用,告诉我没有复制文本属性。(如果我只使用
Copy()
Paste()
就可以了。)即使我手动粘贴,我也能得到我想要的

第二种方法可行,但不采用文本格式。因此,我得到了一些不同于原始文本的其他格式和大小的文本


问题是:如何保留原始字体格式?我试图手动在Word中插入一个文件。我也无法在那里获得原始文本格式。也许这是一种错误的方法?

我用
Copy()
/
Paste()
解决方案解决了这个问题。我需要像这样复制:

MyDoc.ActiveWindow.Selection.Copy();
doc.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.wdFormatOriginalFormatting);

然后它会保留样式。但有时,如果文档有表,它会将它们复制到下一页,这很奇怪。
InsertFile()
方法对我不起作用

PasteFormat将仅粘贴格式,而不是内容,应在CopyFormat方法之后使用。应使用PasteAndFormat方法粘贴包含或不包含WdRecoveryType常量定义的格式的内容。在这里,您应该使用:

doc.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.WDFormatOriginalFormat)


欲了解更多信息,请阅读和了解有关行为的一些背景信息:默认情况下,Word和design Word将使用目标文档中定义的相同的样式定义,以便“无缝”(从格式角度)合并进来的内容。如果传入内容应用了与目标文档中已存在的样式名称相同的样式名称,则传入内容的格式将更改

如回答中所示,使用Windows剪贴板时带有参数
Word.WdRecoveryType.WDFormatOriginalFormat
PasteAndFormat
方法将覆盖默认行为并保留原始格式

然而,通过剪贴板工作并不总是理想的。还有另一种方法,即更改源文档中的样式名称,使其与目标文档中的样式名称不同。如果源文档中始终使用样式,则此方法将起作用。(但是,手动应用的格式仍可能丢失。)

下面的代码片段演示了段落样式的方法。它基于文档中使用的样式创建新样式-除了名称之外,新样式是完全重复的。然后执行“查找/替换”以使用新样式替换样式的所有实例。现在,可以将内容插入到另一个文档中,并保留格式

    Word.Document doc = wdApp.ActiveDocument;
    Word.Style sOld = null;
    Word.Style sCopy = null;
    Word.Find f = doc.Content.Find;

    //Select Normal text, otherwise Normal will take on character formatting of current selected text
    Word.Selection sel = wdApp.Selection;
    sel.Find.set_Style(Word.WdBuiltinStyle.wdStyleNormal);
    sel.Find.Execute("", Type.Missing,
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Word.WdFindWrap.wdFindStop,
      true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    foreach (Word.Style s in doc.Styles)
    {
        if ((s.InUse) && (s.Type == Word.WdStyleType.wdStyleTypeParagraph) && 
            (!s.NameLocal.Contains(" Copy")))
        {
            sOld = s;
            sCopy = doc.Styles.Add(sOld.NameLocal + " Copy", sOld.Type);
            sCopy.set_BaseStyle(sOld);
            f.set_Style(sOld);
            f.Replacement.set_Style(sCopy);
            f.Execute("", Type.Missing, 
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Word.WdFindWrap.wdFindStop, 
            true, "", Word.WdReplace.wdReplaceAll, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        }
    }
    Word.Document doc = wdApp.ActiveDocument;
    Word.Style sOld = null;
    Word.Style sCopy = null;
    Word.Find f = doc.Content.Find;

    //Select Normal text, otherwise Normal will take on character formatting of current selected text
    Word.Selection sel = wdApp.Selection;
    sel.Find.set_Style(Word.WdBuiltinStyle.wdStyleNormal);
    sel.Find.Execute("", Type.Missing,
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Word.WdFindWrap.wdFindStop,
      true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    foreach (Word.Style s in doc.Styles)
    {
        if ((s.InUse) && (s.Type == Word.WdStyleType.wdStyleTypeParagraph) && 
            (!s.NameLocal.Contains(" Copy")))
        {
            sOld = s;
            sCopy = doc.Styles.Add(sOld.NameLocal + " Copy", sOld.Type);
            sCopy.set_BaseStyle(sOld);
            f.set_Style(sOld);
            f.Replacement.set_Style(sCopy);
            f.Execute("", Type.Missing, 
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Word.WdFindWrap.wdFindStop, 
            true, "", Word.WdReplace.wdReplaceAll, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        }
    }