Чтение файла Excel вызывает COMException

#c# #excel #file #interop

#c# #excel #файл #взаимодействие

Вопрос:

Я пытаюсь прочитать из файла EXCEL и отобразить то, что я получаю.

Вот мой класс Excel.

 class Excel
    {
        private string path = "";
        _Application excel = new _Excel.Application();
         Workbook workbook;
         Worksheet worksheet;

        public Excel(string path, int sheet)
        {
            this.path = path;
            workbook = excel.Workbooks.Open(path);
            worksheet = workbook.Worksheets[sheet];
        }

        public string ReadCell(int row, int column)
        {
            row  ;
            column  ;

            if (worksheet.Cells[row, column].Value2 != null)
            {
                return worksheet.Cells[row, column].Value2;
            }
            else
            {
                return "";
            }
        }
    }
  

Вот как я это называю

 string pathToFile = @"K:hourstracking.xlsx";
Excel excel = new Excel(pathToFile, 1);
MessageBox.Show(excel.ReadCell(0, 0));
  

Вот мое исключение

System.Runtime.Службы взаимодействия.COMException HResult=0x80040154 Сообщение = Получение фабрики COM-классов для компонента с CLSID {00024500-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: класс 80040154 не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). Источник=mscorlib StackTrace: в System.Runtime.Удаленное подключение.Удаленные сервисы.AllocateUninitializedObject(RuntimeType ObjectType) в System.Runtime.Удаленное подключение.Активация.ActivationServices.CreateInstance(RuntimeType ServerType) в System.Runtime.Удаленное подключение.Активация.ActivationServices.IsCurrentContextOK(RuntimeType ServerType, Object[] props, логическое значение bNewObj) в System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, Boolean publicOnly, Boolean noCheck, Booleanamp; canBeCached, RuntimeMethodHandleInternalamp; ctor, Booleanamp; bNeedSecurityCheck) в System.RuntimeType.Создайте instanceslow(логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache, StackCrawlMarkamp; stackMark) в System.RuntimeType.Создайте instancedefaultctor (логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache, StackCrawlMark amp; stackMark) в системе.Активатор.CreateInstance(тип type, логическое значение непублично) в системе.Активатор.CreateInstance (введите type) в working_hours.Excel..ctor(путь к строке, лист Int32) в K:programmingvisual_studio_projectsworking_hoursworking_hoursworking_hoursExcel.cs:line 14 в working_hours.Program.Main(строка[] аргументов) в K:programmingvisual_studio_projectsworking_hoursworking_hoursworking_hoursProgram.cs:line 31

Я проверил, правильный ли путь, и это так.

Я думаю, что это может иметь отношение к ссылкам, которые я только что реализовал, но я не совсем уверен.

Я добавил

System.Windows.Forms.dll и Microsoft.Office.Interop.Excel.dll

Если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать.

Спасибо.

Комментарии:

1. Не используйте interop для анализа Excel.

2. Любое другое предложение и почему?

3. Потому что вам это больше не нужно. .xlsx файлы теперь используют OpenXML, открытый и стандартный формат, и вы можете легко их анализировать. Я использовал EPPlus недавно, но там есть тонна библиотеки (LinqToExcel, ClosedXML, …)

4. COM-взаимодействие — это то, чего вы хотели бы придерживаться как можно дальше. Поверьте мне. Если только вы не являетесь специалистом по c и не любите отлаживать утечку памяти, ошибку seg, нарушение доступа, повреждение кучи и т.д. с помощью windbg

5. Обычно мне не нравится, когда кто-то говорит не делать то, что вы пытаетесь сделать, вместо того, чтобы помочь вам это сделать. Но в этом случае я должен согласиться. Взаимодействие — это выгребная яма страданий, и когда вы решите эту проблему, она вознаградит вас злом. Это будет проклинать вас на протяжении поколений. Если вы переключитесь на EPPlus, вы решите эту проблему и предотвратите множество других.