HRESULT: 0x800A03EC в Worksheet.range

Я получаю HRESULT: 0x800A03EC в методе Worksheet.range. Количество строк более 70К. Офис 2007.

Код:

Microsoft.Office.Interop.Excel.Range neededRange
    = currentWS.Range[cell.Cells[1, 1], cell.Cells[nRowCount, nColumnCount]];

Здесь мой rowcount больше 65530. Нарушает эту функцию. Я заметил, что он ломается только тогда, когда количество строк превышает 65530.


person Cannon    schedule 17.08.2011    source источник
comment
Небольшой фрагмент кода или немного больше контекста не повредит, если вы ищете ответы.   -  person Eddy    schedule 18.08.2011
comment
Microsoft.Office.Interop.Excel.Range neededRange = currentWS.Range[cell.Cells[1, 1], cell.Cells[nRowCount, nColumnCount]]; Здесь мое количество строк больше 66000. Количество столбцов - 18. Разрывы в этой функции.   -  person Cannon    schedule 18.08.2011
comment
Используя Excel 2010, я могу без проблем получить диапазон такого размера. Проверьте, действительно ли ваша проблема связана с методом Range или что исключение вызывает cell.Cells [nRowCount, nColumnCount].   -  person Eddy    schedule 18.08.2011
comment
Я попробовал метод Range наоборот, поскольку k.schroeder31 предложил Microsoft.Office.Interop.Excel.Range neededRange = currentWS.Range["A1", ((Microsoft.Office.Interop.Excel.Range)currentWS.Cells[nRowCount, nColumnCount])]; . Но проблема остается.   -  person Cannon    schedule 18.08.2011
comment
можете воспроизвести эту ошибку, см. мой ответ ниже   -  person Eddy    schedule 18.08.2011
comment
Cannon, у меня такая же ошибка, но решение не работает   -  person Cookie Monster    schedule 15.01.2018


Ответы (24)


Эта проблема возникает, если вы используете лист с обратной совместимостью (.xls) вместо .xlsx

Чтобы листы можно было открывать в версии до Office 2007, она не может содержать более 65 тыс. Строк. Вы можете проверить количество строк на листе, используя ctrl + стрелку вниз, пока не дойдете до низа. Если вы попытаетесь получить диапазон больше, чем это количество строк, это приведет к ошибке

person Eddy    schedule 18.08.2011
comment
Не всегда, у меня проблема с листом .xlsx. - person Alex; 26.02.2016
comment
@ user2179427 К сожалению, нет, мне пришлось пойти на компромисс и использовать другой подход. Чего вы пытаетесь достичь? В последнее время я много работал с взаимодействием с Excel, поэтому, возможно, смогу помочь. - person Alex; 07.03.2016
comment
@Alex Я хотел бы записать двойные значения с округлением до двух знаков после запятой на свой рабочий лист в цикле for. Вот мой вопрос, который я опубликовал сегодня: stackoverflow.com/questions/35841073/ - person user2179427; 07.03.2016
comment
@Alex Недавно я перенес свой проект Excel с 2010 на 2016. когда я делаю Sheet.Range (A1) .Select (). Иногда выдает ошибку, иногда работает. Я активировал книгу и лист. Ошибка, которую я вижу, находится в System.RuntimeType.ForwardCallToInvokeMember (String memberName, BindingFlags flags, Object target, Int32 [] aWrapperTypes, MessageData & msgData) в Microsoft.Office.Interop.Excel.Range.Select () - person user1844634; 13.09.2017
comment
Примечание. Это исключение также может быть выдано при попытке ничего не записать в Excel. У меня был DataTable, который был установлен на stored procedure в SQL Server. При попытке экспортировать этот DataTable я получал эту ошибку. Оказалось, что мой stored procedure ничего не возвращает. (Публикация для будущих поисков) - person Symon; 09.10.2018

Мы получали то же самое. Исключением было

Stacktrace: в Microsoft.Office.Interop.Excel._Workbook.SaveAs (имя файла объекта, формат файла объекта, пароль объекта, объект WriteResPassword, объект ReadOnlyRecommended, Object CreateBackup, XlSaveAsAccessMode AccessMode, Object ConflictResolution, Object AddToMru, Text Object TextCodepage, Object AddToMru, Text Object TextCodepage Местный) `

с внутренним исключением

Исключение из HRESULT: 0x800A03EC 2012-11-01 10: 37: 59`

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

  1. Войдите на сервер как администратор.
  2. Перейдите в «Пуск» -> «Выполнить» и введите «taskmgr».
  3. Перейдите на вкладку процессов в диспетчере задач и установите флажок «Показать процессы от всех пользователей».
  4. Если в списке есть записи «Excel.exe», щелкните запись правой кнопкой мыши и выберите «Завершить процесс».
  5. Закройте диспетчер задач.
  6. Перейдите в «Пуск» -> «Выполнить» и введите «services.msc»
  7. Остановите службу, автоматизирующую Excel, если она запущена.
  8. Перейдите в «Пуск» -> «Выполнить» и введите «dcomcnfg».
  9. Откроется окно служб компонентов, разверните «Корень консоли» -> «Компьютеры» -> «Конфигурация DCOM».
  10. Найдите в списке компонентов «Приложение Microsoft Excel».
  11. Щелкните правой кнопкой мыши запись и выберите «Свойства».
  12. Перейдите на вкладку «Identity» в диалоговом окне свойств.
  13. Выберите «Интерактивный пользователь».
  14. Нажмите кнопку «ОК».
  15. Переключитесь на консоль сервисов
  16. Запустить сервис автоматизации Excel
  17. Протестируйте свое приложение еще раз.
person John Fitzpatrick    schedule 01.11.2012
comment
Re. # 7: как называется сервис, который нужно искать? - person B. Clay Shannon; 28.10.2015
comment
Я тоже делаю номер 1-4 - person bot; 13.05.2016
comment
Перезагрузка компьютера также работает, и это может быть более быстрое решение. У меня это сработало; Я попытался выполнить описанные выше действия, но на шаге 9 потерялся. - person loved.by.Jesus; 06.04.2018
comment
Также рассмотрите возможность проверки разрешений; эта ошибка может возникнуть, если у текущего пользователя нет разрешения на запуск и активацию. - person Craig; 05.12.2018

Я столкнулся с этой проблемой.

Обнаружил, что где-то в моем коде я просил его считать, начиная с 0 (как в коде C #).

Оказывается, счет в Excel начинается с 1.

person Cald    schedule 02.02.2015

Глядя на различные ответы, приведенные выше, и опираясь на свой недавний опыт (я получил этот код ошибки, делая что-то совершенно несвязанное - установка Application.Calculation), я прихожу к выводу, что один и тот же код ошибки используется для обозначения нескольких не связанных между собой проблем. Итак, @Garreh, вероятно, вам следует задать новый вопрос (не то чтобы кто-то мог помочь, основываясь только на коде ошибки). Я видел то же самое, работая с взаимодействием Word с C #, где тот же HRESULT, кажется, используется почти для всех видов ошибок. Я так и не нашел удовлетворительной документации Microsoft о том, что могут означать коды.

person Hugh W    schedule 11.02.2013
comment
Это немного забавно, некоторые числа представляют разные ошибки, похожие на ID. - person James Heffer; 08.11.2016

Это также может быть вызвано тем, что у вас нет места в разделе, в который вы сохраняете.

Я проверил свой HD и обнаружил, что он максимален. Перенос некоторых ненужных файлов в другой раздел решил мою проблему.

person Patrickmoe    schedule 07.11.2012

Просто файл excel испорчен. Лучшее решение - изменить / восстановить файл. (Сделайте копию существующего файла и переименуйте его)

person Sonio    schedule 23.10.2012

Я не понимаю в чем проблема. Но вот что решило мою проблему.

Перейдите в Параметры Excel> Сохранить> Сохранить файлы в этом формате> выберите «Книга Excel (*. Xlsx)». Раньше мои рабочие книги открывались в [Режиме совместимости], а теперь они открываются в обычном режиме. Функция диапазона отлично с этим работает.

person Cannon    schedule 18.08.2011
comment
Почему это / было в моем ответе ниже. Режим совместимости подразумевает ограничение в 65 тыс. Строк, в противном случае листы не могут быть открыты в более старых версиях Excel. - person Eddy; 21.08.2011
comment
да. Абсолютно правильно. И мой ответ - решение этой проблемы, если вы используете Office 2007. Спасибо. - person Cannon; 22.08.2011
comment
Я использую Office 2010 (interlop excel 14), и я пытаюсь создать файл xls и сталкиваюсь с этой ошибкой при извлечении ячеек. Любые идеи? - person Gaʀʀʏ; 23.07.2012

К вашему сведению, возникла ошибка при попытке применить стиль строки ....

wSheet.Rows(y).Style = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red)
person htm11h    schedule 09.06.2016

Невозможно ответить / одобрить этот ответ, поэтому разместите здесь :

Действительно, формат диапазонов источника / назначения при перемещении данных из одного диапазона в другой также может вызвать эту ошибку.

В моем случае диапазон, который я хотел скопировать, содержал столбец с форматированием даты, а столбец содержал одну ячейку с недопустимым значением даты (он даже не был отформатирован из-за его значения, которое было отрицательным целым числом). Таким образом, операция копирования между двумя диапазонами останавливалась в указанной ячейке, что приводило к тому самому сообщению об ошибке, которое здесь обсуждается.

В моем случае решением было использовать Range.Value2 вместо Range.Value, в результате чего Excel обходил форматирование ячейки как даты (подробнее здесь < / а>). Однако при этом столбцы даты и времени будут отображаться как целые и десятичные дроби. Однако вы сможете изменить форматы на желаемые, если знаете, где ожидать значения даты и времени, установив соответствующее свойство Range / Column / Cell.NumberFormat.

person Teodor Constantinescu    schedule 23.06.2016

Это не отвечает напрямую на вопрос, но я получал эту ошибку при открытии файла xlsx. Проблема заключалась в том, что я использовал косую черту в пути к файлу. См. Также https://stackoverflow.com/a/24635904/5932003. Раньше он работал в предыдущих версиях Excel, но не работал с версией 1711 (сборка 8730.2127).

Мне удалось диагностировать проблему с помощью IDispatch-> Invoke (..., EXCEPINFO, ...). Объект EXCEPINFO содержал полезное описание того, что пошло не так. Я был в стране C ++, но подозреваю, что код C #, аналогичный этому сообщению SO, поможет: Упаковка IDispatch Invoke с параметрами на C # (с DISPPARAMS).

person kostasvs    schedule 02.01.2018

Я получил этот код ошибки 0x800A03EC при попытке сохранить файл Excel, созданный в моем приложении .Net в VS 2017. Я изменил свойство объекта Excel.Application Visible = True и позволил ему работать до точки отказа. Пытался завершить шаги вручную в Excel, а затем обнаружил, что не могу сохранить файл из-за отсутствия разрешений для папки. Я добавил разрешение на запись в папку, и ошибка исчезла.

person MarkF    schedule 03.01.2019
comment
Была такая же ошибка при проблеме с разрешениями. Программа должна была запускаться ежедневно для создания / обновления файла, но работала только один раз, потому что она создавала файл в месте, которое другие пользователи не могли перезаписать после первоначального создания. - person nvuono; 07.06.2019

Для других, подобных мне, у которых такое же исключение:

Это также может произойти, если вы попытаетесь передать нулевое значение вместо Missing.Value (или Type.Missing)

e.g.

Worksheet worksheet = ...;
return worksheet.Range["A1", null]; //This call generates the error 0x800A03EC

return worksheet.Range["A1", Missing.Value]; //This works correctly
person Ruben Giaquinto    schedule 06.05.2019

в 2021 году, когда у меня возникла эта проблема. на самом деле причина в следующем:

для диапазона или ячейки Excel я пытался добавить / удалить комментарий напрямую, не проверяя, есть ли привязка комментария к нему или нет.

код ошибки:

if ( comments_string.Length != 0)
{     range.AddComment( comments_string);
}

рабочий код:

if ( comments_string.Length != 0)
{     if (range.Comment != null) range.Comment.Delete();
     range.AddComment(comments_string);
}
person Mike Xue    schedule 12.02.2021

РЕДАКТИРОВАТЬ: ЭТО ПУТЬ ЛУЧШЕ !!! Извините, вам не нужна эта старая функция. Просто сделайте следующее:

Microsoft.Office.Interop.Excel.Range neededRange = currentWS.Range["A1", ((Microsoft.Office.Interop.Excel.Range)currentWS.Cells[nRowCount, nColumnCount])];

Это должно сработать как шарм. И для дальнейшего использования поместите соответствующий код, который вы используете, в свой вопрос. Не заставляйте людей просить об этом в комментариях. Полагаю, именно поэтому вас проголосовали против.

person k.schroeder31    schedule 17.08.2011
comment
Я пробовал твой ау, но это все равно исключение. Так что я не думаю, что это имеет какое-либо отношение к тому, как я подаю в суд на функцию Range. - person Cannon; 18.08.2011
comment
О, это странно. Это сработало в моем тесте для очень больших диапазонов. - person k.schroeder31; 18.08.2011
comment
Я не понимаю в чем проблема. Но вот что решило мою проблему. Перейдите в Параметры Excel ›Сохранить› Сохранить файлы в этом формате ›Выберите книгу Excel (*. Xlsx). Раньше мои рабочие книги открывались в [режиме совместимости]. - person Cannon; 18.08.2011
comment
Рад, что ты понял это. Вы должны опубликовать это как ответ и принять его, чтобы люди знали, что проблема решена. - person k.schroeder31; 18.08.2011

У меня возникла ошибка с точным кодом, когда я попытался назначить массив ячеек для range.Value. В моем случае это была проблема с неправильным форматом данных. Формат данных ячейки был задан как ДАТА, но пользователь допустил ошибку и вместо «20.02.2013» ввел дату «20.02.0213». COM-объект Excel отказался принимать год 0213 и выдал исключение с этой ошибкой.

person Evgeny Sobolev    schedule 21.02.2015

Я также столкнулся с той же проблемой, когда разрабатывал приложение, которое экспортирует содержимое проекта в файл Excel.

Я не смог найти решение моей проблемы на форумах, затем я проверяю максимальную мощность Excel и нашел ссылку ниже, в которой говорится

«Размер рабочего листа 1 048 576 строк на 16 384 столбца», и это была проблема в моем случае, я экспортировал больше этих строк. См. Ссылку ниже для получения подробной информации

http://answers.microsoft.com/en-us/office/forum/office_2013_release-excel/with-excel-2013how-many-rows-will-this-contain/271264fb-3ab8-4c5b-aa0d-7095c5ac6108

С уважением, Прашант Неве

person PrashantNeve    schedule 05.02.2016

У меня был такой же код ошибки при выполнении следующего оператора:

sheet.QueryTables.Add("TEXT" & Path.GetFullPath(fileName), "1:1", Type.Missing)

Причина заключалась в отсутствии точки с запятой (;) после "ТЕКСТА".

Вот правильный:

sheet.QueryTables.Add("TEXT;" & Path.GetFullPath(fileName), "1:1", Type.Missing)
person Beppe Serra    schedule 02.02.2017

Я получил это исключение, потому что набрал:

ws.get_Range("K:K").EntireColumn.AutoFit();
ws.get_Range("N:N").EntireColumn.AutoFit();
ws.get_Range("0:0").EntireColumn.AutoFit();

Видите ошибку? Подсказка: Excel принимает индексирование от 1, но не от 0, как это делает C #.

person Pedro    schedule 10.03.2017

Я получил эту ошибку, потому что пытался переименовать лист со слишком большим количеством символов

person Blobby    schedule 29.05.2017

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

В других сообщениях не упоминалось, что эта ошибка часто возникает, если рабочий лист заблокирован. Хотя я не тестировал все сценарии, кажется, что все, что вы не можете сделать в Excel, когда лист заблокирован, вызывает эту ошибку, если вы пытаетесь сделать это через VSTO / Com, когда лист заблокирован. НАПРИМЕР. Изменение любого артефакта стиля (шрифт, размер шрифта, цвет, подчеркивание), изменение проверки Excel, изменение ширины столбца, высоты строк, формул

person JimbobTheSailor    schedule 08.09.2017

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

mWorkBook = xlApp.Workbooks.Open(FilePath)

mWorkBook.Save();

РАЗРЕШЕНО

person Pankaj Garg    schedule 25.04.2018

Похоже, это довольно обычная ошибка "что-то пошло не так" с выполненной вами операцией. Я заметил, что это также произойдет, если у вас есть ошибка формулы и вы назначаете эту формулу в ячейку. Например. "= fubar ()"

person Dan Sorak    schedule 17.04.2019

Я сталкивался с этим несколько раз, и каждый раз всегда возникала какая-то ошибка либо с дублированием имени вкладки, либо в этом случае это просто происходило потому, что у меня просто была опечатка в get_Range, где я пытался чтобы получить ячейку по номеру и номеру, а не по букве и цифре.
Сводили меня с ума, потому что ошибка указала мне на несколько строк ниже, но я закомментировал все создание других листов над < em> "строка ошибки", а те, что в строке и ниже, были созданы без проблем.
Я просканировал несколько строк выше и увидел, что я поместил 6 + lastword, C + lastrow в свой get_Range оператор и конечно, у вас не может быть ячейки, начинающейся с числа, это всегда буква, чем цифра.

person Robert L Taylor    schedule 30.09.2019

Этот тип ошибки также может возникать, если файл Excel по какой-либо причине поврежден.

person Arun    schedule 01.12.2017