Ошибка C# Selection.InsertFile

Я работаю над надстройкой Office. Я застрял в проблеме. Я хочу добавить текстовый документ в качестве связанного объекта в другой текстовый документ, используя С# и VSTO. Я покопался и обнаружил, что для этого нужно использовать поле INCLUDETEXT. В VSTO функция InsertFile имеет параметр с именем "Link", если для этого параметра установлено значение true, то указанный текстовый документ вставляется как связанный объект.

Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using Microsoft.Office.Interop.Word;
using System.Windows.Forms;
using System.Drawing;

namespace WordAddIn1
{
    public partial class MyRibbon
    {
        string txt = "";
        bool hhh = false;
        string file_name = "";
        string file_path = "";
        DataObject o;
        string cmp="";

        private void MyRibbon_Load(object sender, RibbonUIEventArgs e)
        {
            checkBox1.Checked = false;
            o = (DataObject)Clipboard.GetDataObject();

        }

        private void checkBox1_Click(object sender, RibbonControlEventArgs e)
        {

            if (checkBox1.Checked == true && (o.ContainsText()||o.ContainsImage()))
            {


                txt = Globals.ThisAddIn.Application.Selection.Text.Trim();
                file_name = Globals.ThisAddIn.Application.ActiveDocument.Name;
                file_path = Globals.ThisAddIn.Application.ActiveDocument.Path;
                cmp = file_path + "\\" + file_name;
                hhh = txt.Length > 0;

                if (hhh)
                {

                    Console.Beep();

                }
            }

            else
            {

                if (o.ContainsText() || o.ContainsImage())
                {
                    string FileName = "C:\\final.docx";
                    object range = "hashim";

                     object ConfirmConversions = false;
                     object Link = true;
                     object Attachment = false;


                     Globals.ThisAddIn.Application.Selection.InsertFile(FileName, range,ConfirmConversions ,Link,  Attachment);

                     Form1 frm = new Form1(file_name.ToString(),file_path.ToString());
                    frm.Show();

                }

            }

    }



    }
}

Линия

Globals.ThisAddIn.Application.Selection.InsertFile(FileName, range,ConfirmConversions, Link, Attachment);

не показывает никаких ошибок в редакторе или во время компиляции, но когда я использую свою надстройку в офисе, она выдает ошибку в этой строке и говорит "Ошибка команды"

Вот скрин ошибки

введите здесь описание изображения

Вот StackTrace ошибки

введите здесь описание изображения

Но когда я просто использую эту строку, она не дает ошибки, и файл вставляется, но не как связанный объект.

Globals.ThisAddIn.Application.Selection.InsertFile(FileName)

В чем проблема ? Также скажите мне, есть ли у вас лучшая идея вставить связанный объект (документ Word) в другой документ. ?


person Muhammad Hashim Shafiq    schedule 14.09.2016    source источник
comment
Содержит ли вставляемый документ закладку с именем hashim?   -  person Dirk Vollmar    schedule 14.09.2016
comment
@DirkVollmar да, он содержит   -  person Muhammad Hashim Shafiq    schedule 14.09.2016
comment
Можете ли вы успешно вставить поле INCLUDETEXT вручную? На вкладке Вставка выберите Быстрые частиПоля..., затем выберите ВКЛЮЧИТЬТЕКСТ слева и нажмите Коды полей< Кнопка /i>. Затем введите INCLUDETEXT "C:\\final.docx" hashim в качестве кода поля. Если есть проблема с именем файла или закладки, вы, скорее всего, получите лучшее сообщение об ошибке, чем сообщение от COMException.   -  person Dirk Vollmar    schedule 14.09.2016
comment
@DirkVollmar спасибо за ваш комментарий. Я заработал. Большое спасибо, сэр. Большое спасибо.   -  person Muhammad Hashim Shafiq    schedule 14.09.2016
comment
Можете ли вы сказать, каково было ваше решение? Тогда ваш пост может быть полезен и другим :-)   -  person Dirk Vollmar    schedule 14.09.2016
comment
@DirkVollmar да, я предлагаю решение, чтобы другие могли извлечь из этого пользу.   -  person Muhammad Hashim Shafiq    schedule 14.09.2016
comment
@DirkVollmar, пожалуйста, просмотрите мое решение.   -  person Muhammad Hashim Shafiq    schedule 14.09.2016


Ответы (1)


Примечание. В приведенном выше коде нет ошибки. Проблема заключается в том, что у меня нет объекта закладки в моем текстовом файле, который будет связан. Я создал один с именем "hashim", и он прекрасно работает.

Решение:

Если мы перейдем к документации InsertFile

Summary:
        //     Inserts all or part of the specified file.
        //
        // Parameters:
        //   FileName:
        //     Required String. The path and file name of the file to be inserted. If you don't
        //     specify a path, Microsoft Word assumes the file is in the current folder.
        //
        //   Range:
        //     Optional Object. If the specified file is a Word document, this parameter refers
        //     to a bookmark. If the file is another type (for example, a Microsoft Excel worksheet),
        //     this parameter refers to a named range or a cell range (for example, R1C1:R3C4).
        //
        //   ConfirmConversions:
        //     Optional Object. True to have Word prompt you to confirm conversion when inserting
        //     files in formats other than the Word Document format.
        //
        //   Link:
        //     Optional Object. True to insert the file by using an INCLUDETEXT field.
        //
        //   Attachment:
        //     Optional Object. True to insert the file as an attachment to an e-mail message.

См. параметр Диапазон. Если файл, на который мы ссылаемся, является "Документом Word", то в этом файле должна быть создана закладка с именем. Вы должны передать это имя закладки в объект Range. Нравиться

object Range = "hashim";

здесь hashim — имя закладки в файле, связанном с другим файлом документа.

Если закладка не указана, она должна выдавать ошибку.

Теперь, если связывающий объект является документом Excel, объект диапазона должен содержать информацию о ячейках, например

object Range = "R1C1:R3C4";

Здесь R1C1:R3C4 — диапазон ячеек в Excel, который мы хотим связать в нашем документе.

Примечание. Мы можем добавить полный или частичный документ Excel или Word. Просто см. документацию по Range Object.

Надеюсь, ответ вам ясен. Спасибо

person Muhammad Hashim Shafiq    schedule 14.09.2016