Ошибка С# при чтении файла Excel, это странная ошибка

Когда я читаю (*.xls) файл на С#, я получаю сообщение об ошибке.

Я вижу много тем о «Проблеме отказа в доступе к DCOM» и настройке связанной проблемы в SO, но ни одна из них не решила мою проблему. все разрешения и учетная запись администратора были проверены. это изображение ошибки:

Обновление: это зарегистрированная ошибка приложения:

Error       : The remote procedure call failed. (Exception from HRESULT: 0x800706BE)
Stack Trace : at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)
   at Pardic.WebProcess.frmGetPrice.worker_DoWork(Object sender, DoWorkEventArgs e)
^^-------------------------------------------------------------------^^
Source      : Microsoft.Office.Interop.Excel
Method      : Quit
Date        : 02:21:19 ب.ظ
Time        : 07/03/1398
Computer    : DESKTOP-2QPBGQ1
Error       : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
Stack Trace : at Microsoft.Office.Interop.Excel.ApplicationClass.Quit()
   at Pardic.WebProcess.frmGetPrice.worker_DoWork(Object sender, DoWorkEventArgs e)

Это журналы событий Windows:

Log Name:      Application
Source:        Application Error
Date:          5/28/2019 2:16:11 PM
Event ID:      1000
Task Category: (100)
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      DESKTOP-2QPBGQ1
Description:
Faulting application name: EXCEL.EXE, version: 15.0.4420.1017, time stamp: 0x506741b5
Faulting module name: ntdll.dll, version: 10.0.14393.2214, time stamp: 0x5ac2f612
Exception code: 0xc0000005
Fault offset: 0x000000000004961c
Faulting process id: 0x1934
Faulting application start time: 0x01d5153a29e7eeb5
Faulting application path: C:\Program Files\Microsoft Office\Office15\EXCEL.EXE
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 9910317c-cd4c-49b2-8869-76f88b722123
Faulting package full name: 
Faulting package-relative application ID: 
Event Xml:
<Event xmlns = "http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name = "Application Error" />
    <EventID Qualifiers = "0">1000</EventID>
    <Level>2</Level>
    <Task>100</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime = "2019-05-28T09:46:11.052916900Z" />
    <EventRecordID>20076</EventRecordID>
    <Channel>Application</Channel>
    <Computer>DESKTOP-2QPBGQ1</Computer>
    <Security />
  </System>
  <EventData>
    <Data>EXCEL.EXE</Data>
    <Data>15.0.4420.1017</Data>
    <Data>506741b5</Data>
    <Data>ntdll.dll</Data>
    <Data>10.0.14393.2214</Data>
    <Data>5ac2f612</Data>
    <Data>c0000005</Data>
    <Data>000000000004961c</Data>
    <Data>1934</Data>
    <Data>01d5153a29e7eeb5</Data>
    <Data>C:\Program Files\Microsoft Office\Office15\EXCEL.EXE</Data>
    <Data>C:\Windows\SYSTEM32\ntdll.dll</Data>
    <Data>9910317c-cd4c-49b2-8869-76f88b722123</Data>
    <Data>
    </Data>
    <Data>
    </Data>
  </EventData>
</Event>

Ошибка С# при чтении файла Excel, это странная ошибка

и это список установленных программ:

Ошибка С# при чтении файла Excel, это странная ошибкаОшибка С# при чтении файла Excel, это странная ошибка

    public static System.Collections.Generic.List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo> ReadResult(string fileAddress)
        {
            List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo> retList = new List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo>();
            Microsoft.Office.Interop.Excel.Application oXL;
            oXL = new Microsoft.Office.Interop.Excel.Application();
            try
            {
                Microsoft.Office.Interop.Excel.Workbook theWorkbook = oXL.Workbooks.Open(fileAddress);
                Microsoft.Office.Interop.Excel.Sheets sheets = theWorkbook.Worksheets;
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(1);
                foreach (Microsoft.Office.Interop.Excel.Worksheet item in sheets)
                {
                    if (item.Name.Contains("Main"))
                    {
                        Microsoft.Office.Interop.Excel.Range ShtRange = item.UsedRange;
                        int CodeColumnNum = 0;
                        int PriceColumnNum = 0;
                        int NameColumnNum = 0;
                        int num = 0;
                        for (num = 1; num <= ShtRange.Columns.Count; num++)
                        {
                            try
                            {
                                string temp = string.Empty;
                                try
                                {
                                    temp = ShtRange.Cells[1, num].Value2.ToString();
                                }
                                catch
                                {
                                    temp = string.Empty;
                                }
                                if (temp.Contains("كد دارو"))
                                    CodeColumnNum = num;
                                if (temp.Contains("تغيير قيمت"))
                                    PriceColumnNum = num;
                                if (temp.Contains("نام دارو"))
                                    NameColumnNum = num;
                            }
                            catch (Exception ex)
                            {
                                if (CodeColumnNum > 0 && PriceColumnNum > 0 && NameColumnNum > 0)
                                    break;
                                oXL.Quit();
                                throw ex;
                            }
                        }

                        for (num = 2; num <= ShtRange.Rows.Count; num++)
                        {
                            Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo drug = new Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo();
                            string Codetemp = string.Empty;
                            try
                            {
                                Codetemp = ShtRange.Cells[num, CodeColumnNum].Value2.ToString();
                            }
                            catch
                            {
                                Codetemp = string.Empty;
                            }
                            string Pricetemp = string.Empty;
                            try
                            {
                                Pricetemp = ShtRange.Cells[num, PriceColumnNum].Value2.ToString();
                            }
                            catch
                            {
                                Pricetemp = string.Empty;
                            }
                            drug.Drug_Code = CodeAnalize(Codetemp);
                            drug.Drug_Price = PriceAnalize(Pricetemp);
                            drug.Drug_Name = ShtRange.Cells[num, NameColumnNum].Value2;
                            if (drug.Drug_Price != string.Empty && drug.Drug_Code != string.Empty)
                                retList.Add(drug);
                        }
                    }
                }

             theWorkbook.Save();
                return retList; 
            }
            catch //(Exception ex)
            {
                return null;
            }
            finally
            {
                oXL.Quit();
            }
        }

эта проблема появляется, когда я переустанавливаю окна и офис. офис установки 2013 (и офис, и винда 64-битные)

Обновлять:

При сбое Excel появляется ли ошибка в средстве просмотра событий Windows?

simonalexander2005 28.05.2019 11:37

@simonalexander2005, пожалуйста, смотрите мои обновления

user6840413 28.05.2019 12:06

Это веб-приложение, работающее в IIS?

Vanice 28.05.2019 12:12

@HansPassant не имеет отношения к открытому Excel. потому что не работает excel. Я закрыл все связанные с приложением.

user6840413 28.05.2019 14:37

@Akj, пожалуйста, смотрите мое редактирование в моем ответе ниже

Vanice 28.05.2019 15:20

Попробуйте запустить приложение от имени администратора. Это помогает? Кроме того, что такое «адрес файла», который передается? Это относительный или абсолютный путь? Если относительно, работает ли приложение C# в ожидаемом месте?

simonalexander2005 28.05.2019 16:06

@simonalexander2005 да, запусти от имени администратора, ничего не изменилось. адрес файла через открытый диалог. Приложение С# запущено. в какой-то маленькой системе это приводит к ошибкам.

user6840413 29.05.2019 20:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
1 616
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Избегайте Interop, если он вам действительно не нужен!

Для Excel вы можете использовать ЭПлюс, которая является отличной библиотекой C# для чтения/записи файлов Excel.

Работает отлично и не требует установки Excel на ПК.

Обновлено: Поскольку переход с Interop на EPPlus не подходит для автора, и с дополнительной информацией об ошибке я хотел бы добавить следующее к своему ответу.

Ошибка "Отказано в доступе". Поэтому я могу думать о двух причинах:

  1. Недостаточно прав для пользователя, чтобы открыть эту книгу или запустить процесс Excel.

  2. Книга используется другим процессом (Excel, ...)

Для 1: проверьте, может ли исполняющий пользователь получить доступ к книге и ему разрешено запускать Excel. Обратите внимание, что для веб-приложения IIS пользователь является «пользователем пула приложений IIS», а не администратором.

Для 2: это то, о чем Ганс упоминал ранее. Убедитесь, что другие экземпляры Excel не запущены.

Я не могу изменить Interop, потому что это приложение используется на + 10000 клиентов и приложение Windows. Мне нужно решение с ним. Я знаком с полезным, который вы предложили.

user6840413 28.05.2019 11:43

Тогда вам нужно добавить больше информации к вашему вопросу. Что такое сообщение об ошибке (см. Журнал событий Windows). Или вы можете определить строку кода, где происходит сбой?

Vanice 28.05.2019 11:49

пожалуйста, смотрите мои обновления. +1 за ваше хорошее решение, но моя проблема не решена.

user6840413 28.05.2019 12:07

Благодаря вашей помощи, ничего не работает. все в порядке. и IIS здесь не используется.

user6840413 30.05.2019 11:18
Ответ принят как подходящий

После множества советов, работ и подсказок я удалил программное обеспечение Foxit Reader, и теперь файл xls работает отлично. почему Microsoft не может обнаружить эту ошибку.

Другие вопросы по теме