Вставка одного документа в другой Microsoft.Office.Interop.Word - PullRequest
1 голос
/ 30 сентября 2019

Я имею дело с надстройкой Word VSTO. Я написал код, который вставляет один документ в другой. У меня есть два разных подхода. Copy / Paste и InsertFile: 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)

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 вручную. И я не могу получить оригинальный форматирование там же. Маби, это неправильный подход?

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Я выяснил это с помощью решения для копирования пасты. Мне нужно скопировать так:

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

Тогда он сохраняет стили шрифта. Но иногда, если в документе есть таблицы, он копирует их на следующую страницу. Что странно. Метод InsertFile у меня не работает.

0 голосов
/ 02 октября 2019

Некоторая справочная информация о поведении: по умолчанию и по замыслу Word будет использовать те же определения style , как определено в документе target , так что контент будет поступатьв объединяется "безразлично" (с точки зрения форматирования). Если входящий контент имеет те же имена стилей, которые применены к тому, что уже присутствует в целевом документе, форматирование входящего контента изменится.

Как показано в ответе, PasteAndFormat сметод параметра Word.WdRecoveryType.wdFormatOriginalFormatting при использовании буфера обмена Windows переопределяет поведение по умолчанию и поддерживает исходное форматирование.

Однако работа через буфер обмена не всегда желательна или идеальна. Есть еще один способ, который заключается в изменении имен стилей в исходном документе, чтобы они отличались от имени в целевом документе. Этот подход будет работать, если стили использовались последовательно в исходном документе. (Однако форматирование, примененное вручную, все еще может быть потеряно.)

Следующий фрагмент кода иллюстрирует подход к стилям абзаца. Он создает новый стиль на основе стилей, используемых в документе - новый стиль является точной копией, за исключением имени. Затем выполняется поиск / замена, чтобы заменить все экземпляры стиля новым стилем. Теперь содержимое может быть вставлено в другой документ, и форматирование сохраняется.

    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);
        }
    }
0 голосов
/ 01 октября 2019

PasteFormat будет вставлять только формат, а не содержимое, и его следует использовать после метода CopyFormat. Метод PasteAndFormat должен использоваться для вставки содержимого с форматом или без него, как определено константой WdRecoveryType. Здесь вы должны использовать:

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

Для получения дополнительной информации прочитайте Метод PasteAndFormat и WdRecoveryTypeпостоянная

...