com исключение excel InteropServices.COMException - c # - PullRequest
0 голосов
/ 28 июня 2019

Я получаю System.Runtime.InteropServices.COMException при запуске нижеуказанного метода от main()

Я хочу получить true и позже получить доступ к листу, если Excel открыт в системе. Я уверен, что Excel открыт и sheet1 есть, но я получаю false и ошибка выше.

using Excel = Microsoft.Office.Interop.Excel;

         public static bool IsExcelOpened(string sheet1)
    {
        bool isOpened = true;
        Excel.Application exApp;
        exApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
        try
        {
            Excel.Worksheet xlWorksheet;
            xlWorksheet = (Excel.Worksheet)exApp.Workbooks.get_Item(sheet1);
        }
        catch (Exception)
        {
            isOpened = false;
        }
        return isOpened;
    }

РЕДАКТИРОВАТЬ: когда я запускаю VS2019 от имени администратора, я получил больше информации об ошибке

Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))

1 Ответ

1 голос
/ 28 июня 2019

Я думаю, что ваша проблема в Visual Studio, работающем в другом контексте для Excel.

Я попробовал слегка модифицированную версию вашего кода, и она отлично работает при запуске Visual Studio НЕ в качестве администратора (тот же пользователь, с которым был открыт Excel).

ВозможноСтоит проверить, что вы используете правильную версию interop dll.

public bool IsExcelOpened()
        {
            bool isOpened = false;

            try
            {
                Excel.Application exApp;
                Excel.Worksheet xlWorksheet;
                exApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
                if(exApp != null)
                {
                    xlWorksheet = (Excel.Worksheet)exApp.ActiveSheet;
                    isOpened = true;
                }
            }
            catch { }
            return isOpened;
        }
...