Вставить диапазон Excel в активный документ Word открывает узел драйвера принтера для приложений - PullRequest
0 голосов
/ 10 апреля 2020

Я реализую некоторый код для встраивания листа Excel в документ Word. В рамках процесса Print driver host for applications открывается, когда вставить (вставить специальные) скопированный диапазон Excel на Word. Я создал некоторый пример кода для воссоздания проблемы.

private void button1_Click(object sender, EventArgs e)
{
     string path = @"C:\Users\Aps\Desktop\excelDoc.xlsx";
     Word.Document doc = GetActiveDocument();
     Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
     dynamic ExcelInst = Activator.CreateInstance(ExcelType);
     excelapp = ExcelInst;
     excelapp.Visible = false;

     workbook = excelapp.Workbooks.Open(path, true);
     Excel.Worksheet sheet = workbook.Sheets[1];
     Excel.Range excelRange = sheet.Range["A1","E7"];
     sheet.Activate();
     excelRange.Copy();

     Word.Range wordRange = doc.Range();
     wordRange.InsertParagraphAfter();
     wordRange.Collapse(Word.WdCollapseDirection.wdCollapseEnd);

     // insert embedded worksheet
     wordRange.PasteSpecial(
         Link: false,
         DataType: Word.WdPasteDataType.wdPasteOLEObject,
         Placement: Word.WdOLEPlacement.wdInLine,
         DisplayAsIcon: false
     );
     CloseWorkbook();
}

private void CloseWorkbook()
{
    try
    {
        if (workbook != null)
        {
            workbook.RefreshAll();
            workbook.Close(SaveChanges: true);
        }
        if (excelapp != null)
        {
            var process = Process.GetProcessesByName("EXCEL").OrderByDescending(p => p.StartTime).First();
            if (!process.HasExited)
            {
                process.Kill();
            }
        }
    }
    catch
    {
        //Erorr handling
    }
}

private Word.Document GetActiveDocument()
{
    object word;
    Word.Document _activeDocument;

    try
    {
        word = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
        //If there is a running Word instance, it gets saved into the word variable
    }
    catch (Exception ex)
    {
        //If there is no running instance, it creates a new one
        Type type = Type.GetTypeFromProgID("Word.Application");
        word = System.Activator.CreateInstance(type);
    }

    Word.Application oWord = (Word.Application)word;
    _activeDocument = oWord.ActiveDocument;

    return _activeDocument;
}

В моем приложении я использую файл MyStyles.dotx, где мы храним собственные стили для полей слов. Из-за этого хоста драйвера принтера для приложения не закрывается проблема, после использования функции встраивания Excel кажется, что файл MyStyles.dotx закрывается неправильно, и при следующем запуске машины открывается копия MyStyles.dotx. Я попытался вручную закрыть хост драйвера печати для приложений, использующих диспетчер задач, и тогда проблема с повторным открытием MyStyles.dotx при запуске компьютера больше не существовала.

Почему это приложение хоста драйвера принтера для приложений открывается в wordRange.PasteSpecial?

Есть ли способ избежать открытия приложения "Узел драйвера принтера для приложений", когда wordRange.PasteSpecial?

Если нет, то как закрыть этот «узел драйвера принтера для приложений» после встраивания Excel в слово?

...