Ошибка Excel HRESULT: 0x800A03EC при попытке получить диапазон с именем ячейки

Я работаю с проектом Window Service. которые должны записывать данные на лист в файле Excel в последовательности раз.

Но иногда, только иногда, служба выдает исключение «Exception from HRESULT: 0x800A03EC», когда пытается получить диапазон с именем ячейки.

Я поместил сюда код открытия листа Excel и получения ячейки.

  • ОС: оконный сервер 2003 Office:
  • Microsoft Office 2003 sp2

1: Открытие листа Excel

  m_WorkBook = m_WorkBooks.Open (  this.FilePath, 0, false, 5, "", "", true, Excels.XlPlatform.xlWindows, ";", true, false, 0, true, 0, 0);  

2: Получение ячейки для записи

  защищенный объект m_MissingValue = System.Reflection.Missing.Value; Range range = m_WorkSheet.get_Range (cell.CellName, m_MissingValue); //ошибка этого метода, а имя ячейки - строка.  

Код ошибки 0x800A03EC (или -2146827284) означает NAME_NOT_FOUND; Другими словами, вы что-то просили, а Excel не может этого найти.

Это общий код, который может применяться ко многим вещам, которые он не может найти, например. использование недействительных в то время свойств, таких как PivotItem.SourceNameStandard , вызывает это, когда к PivotItem не применен фильтр. Worksheets ["BLAHBLAH"] выбрасывает это, когда лист не существует и т. д. В общем, вы просите что-то с определенным именем, а этого не существует. Что касается того, почему, это потребует некоторых усилий с вашей стороны.

Убедитесь, что на вашем листе определенно есть диапазон, который вы запрашиваете, или что .CellName — это определенно возвращая имя диапазона, который вы запрашиваете.


Я столкнулся с этой ошибкой, потому что я был попытка записать строку в ячейку, которая начинается с «=».

Решение заключалось в том, чтобы поставить перед знаком равенства «‘» (апостроф), что является способом сообщить excel, что вы на самом деле не пытаетесь написать формулу, а просто хотите напечатать знак равенства.


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

Решение заключалось в том, чтобы поставить перед знаком равенства «‘» (апостроф), что является способом сообщить excel, что вы на самом деле не пытаетесь написать формулу, а просто хочу напечатать знак равенства.


Я получил сообщение об ошибке с пробелом в имени листа:

  using (var range = _excelApp.Range ["Имя листа имело пробел! $ A $ 1"]. WithComCleanup ())  

Я исправил это, заключив имена листов в одинарные кавычки с пробелами:

  using (var range = _excelApp.Range ["'Имя листа имело пробел'! $ A $ 1"]. WithComCleanup ())  


Я получил ошибку с пробелом в имени листа:

  using (var range = _excelApp.Range ["Имя листа имело пробел! $ A $ 1"]. WithComCleanup ())  

Я исправил это, заключив имена листов в одинарные кавычки с пробелами:

  using (var range = _excelApp.Range ["'Имя листа имело пробел'! $ A $ 1"  ] .WithComCleanup ())  

Значение полностью недокументированного ошибка 800A03EC (позор Microsoft!) выглядит как «ОПЕРАЦИЯ НЕ ПОДДЕРЖИВАЕТСЯ».

Это может произойти

  • при открытии документ, содержащий содержимое, созданное более новой версией Excel, которое ваша текущая версия Excel не понимает.
  • когда вы сохраняете документ по тому же пути, откуда вы его загрузили (файл уже открыт и заблокирован)

Но в основном вы увидите эта ошибка вызвана серьезными ошибками в Excel.

  • Например, Microsoft.Office.Interop.Excel.Picture имеет свойство «Включено». Когда вы его вызываете, вы должны получить значение типа bool. Но вместо этого вы получите ошибку 800A03EC. Это ошибка.
  • А в Exel 2013 и 2016 есть очень серьезная ошибка: когда вы автоматизируете процесс Excel и устанавливаете Application.Visible = true и Application.WindowState = XlWindowState.xlMinimized , тогда вы получите сотни ошибок 800A03EC от различных функций (например, Range.Merge (), CheckBox.Text, Shape.TopLeftCell, Shape.Locked и многих других) . Этой ошибки нет в Excel 2007 и 2010.

Значение полностью недокументированная ошибка 800A03EC (позор Microsoft!) имеет вид «ОПЕРАЦИЯ НЕ ПОДДЕРЖИВАЕТСЯ».

Это может произойти

  • , когда вы открываете документ, содержимое которого создано более новой версией Excel, которое ваша текущая версия Excel не понимает.
  • при сохранении документа по тому же пути, по которому вы загрузили это из (файл уже открыт и заблокирован)

Но в основном вы увидите эту ошибку из-за серьезных ошибок в Excel.

  • Например, Microsoft.Office.Interop.Excel.Picture имеет свойство «Включено». Когда вы его вызываете, вы должны получить значение типа bool. Но вместо этого вы получите ошибку 800A03EC. Это ошибка.
  • А в Exel 2013 и 2016 есть очень серьезная ошибка: когда вы автоматизируете процесс Excel и устанавливаете Application.Visible = true и Application.WindowState = XlWindowState.xlMinimized , тогда вы получите сотни ошибок 800A03EC от различных функций (например, Range.Merge (), CheckBox.Text, Shape.TopLeftCell, Shape.Locked и многих других) . Этой ошибки нет в Excel 2007 и 2010..

Я нашел здесь возможное решение: http://www.made4dotnet.com/ Default.aspx? Tabid = 141 & aid = 15

Изменить:

Если вы автоматизируете Microsoft Excel с помощью Microsoft Visual Basic .NET, Microsoft Visual C # .NET или Microsoft Visual C ++, вы можете получить следующие ошибки при вызове определенных методов, поскольку на компьютере установлен языковой стандарт, отличный от американского английского (идентификатор языкового стандарта или LCID 1033):

Исключение из HRESULT: 0x800A03EC

и/или

Старый формат или недопустимая библиотека типов

РЕШЕНИЕ 1:


Чтобы обойти эту ошибку, вы можете установить CurrentCulture в en-US при выполнении кода, связанного с Excel, и выполнить возврат к исходному состоянию с помощью этих двух функций.

 //объявляем переменную для хранения CurrentCultureSystem.Globalization.CultureInfo oldCI;//получаем старую CurrenCulture и устанавливаем новую en-USvoid SetNewCurrentCulture () {oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;  System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("en-US");}//сбрасываем текущую культуру обратно на исходное значение void ResetCurrentCulture () {System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;  }  

РЕШЕНИЕ 2:


Другое решение, которое может сработать, создать каталог 1033 в Microsoft Office Office11 (или в соответствующем office-version), скопируйте excel.exe в каталог 1033 и переименуйте его в xllex.dll.

Хотя вы можете решить проблему, используя одно из этих решений, когда вы вызываете объектную модель Excel в языковых стандартах, отличных от английского (США), объектная модель Excel может действовать иначе, и ваш код может дать сбой, о котором вы, возможно, даже не догадывались. Например, у вас может быть код, который устанавливает значение диапазона для даты:

yourRange.Value2 = «10/10/09»

В зависимости от locale этот код может действовать по-другому, в результате чего Excel помещает в диапазон любое из следующих значений:

10 октября 2009 г. 10 сентября 2009 г. 9 октября 2010 г.


Я нашел здесь возможное решение: http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15

Изменить:

Если вы автоматизируете Microsoft Excel с помощью Microsoft Visual Basic .NET, Microsoft Visual C # .NET или Microsoft Visual C ++, вы можете получить следующие ошибки при вызове определенных методов из-за того, что на компьютере установлен языковой стандарт, отличный от английского (США) (идентификатор языкового стандарта или LCID 1033):

Исключение из HRESULT: 0x800A03EC

и/или

Старый формат или библиотека недопустимого типа

РЕШЕНИЕ 1:


Чтобы обойти это e rror, вы можете установить CurrentCulture в en-US при выполнении кода, связанного с Excel, и вернуться к исходному состоянию с помощью этих двух функций.

 //объявляем переменную для хранения CurrentCultureSystem  .Глобализация. CultureInfo oldCI;//получаем старую CurrenCulture и устанавливаем новую en-USvoid SetNewCurrentCulture () {oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;  System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("en-US");}//сбрасываем текущую культуру обратно на исходное значение void ResetCurrentCulture () {System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;  }  

РЕШЕНИЕ 2:


Другое решение, которое может сработать, создать каталог 1033 в Microsoft Office Office11 (или в соответствующем office-version), скопируйте excel.exe в каталог 1033 и переименуйте его в xllex.dll.

Хотя вы можете решить проблему, используя одно из этих решений, когда вы вызываете объектную модель Excel в языковых стандартах, отличных от английского (США), объектная модель Excel может действовать иначе, и ваш код может дать сбой, о котором вы, возможно, даже не догадывались. Например, у вас может быть код, который устанавливает значение диапазона для даты:

yourRange.Value2 = «10/10/09»

В зависимости от locale этот код может действовать по-разному, в результате чего Excel помещает в диапазон любое из следующих значений:

10 октября 2009 г. 10 сентября 2009 г. 9 октября 2010 г.


У меня возникла эта проблема, когда я пытался использовать функцию range.AddComment (). Я смог решить эту проблему, вызвав range.ClearComment () перед добавлением комментария.


У меня возникла эта проблема, когда я пытался использовать range.AddComment () функция. Мне удалось решить эту проблему, вызвав range.ClearComment () перед добавлением комментария.


Я столкнулся с этот код ошибки при перечислении имен и вызове worksheet.get_Range (name). Кажется, это происходит, когда имя НЕ применяется к диапазону, в моем случае это имя макроса.


Я столкнулся с этим код ошибки при перечислении имен и вызове worksheet.get_Range (name). Кажется, это происходит, когда имя НЕ применяется к диапазону, в моем случае это имя макроса.


Я получил это, когда забыл снять защиту с книги или листа.


Я получил это, когда забыл снять защиту с книги или листа.


Используя ответ Доминика, я обнаружил, что ответ на мою проблему, в частности, был недопустимым DateTiime в исходных данных до того, как он был применяется к диапазону. Где-то между базой данных, .NET и Excel преобразование даты по умолчанию уменьшилось до «01.01.1899 12:00:00 AM». Мне пришлось проверить его и преобразовать в пустую строку, и он исправил это для меня.

  if (objectArray [row, col] .ToString () == "1/ 1/1899 12:00:00 AM ") {objectArray [row, col] = string. Empty;}  

Вероятно, это довольно конкретный пример, но, надеюсь, он сэкономит время кому-то еще, если они попытаются отследить часть неверных данных.


Используя ответ Доминика, я обнаружил, что ответ на мою проблему, в частности, был недопустимым DateTiime в исходных данных до того, как он был применен к диапазону. Где-то между базой данных, .NET и Excel преобразование даты по умолчанию уменьшилось до «01.01.1899 12:00:00 AM». Мне пришлось проверить его и преобразовать в пустую строку, и он исправил это для меня.

  if (objectArray [row, col] .ToString () == "1/ 1/1899 12:00:00 AM ") {objectArray [row, col] = string.Empty;}  

Вероятно, это довольно конкретный пример, но, надеюсь, он кого-нибудь спасет еще какое-то время, если они пытаются отследить часть неверных данных.


Я столкнулся с аналогичным ошибка при запуске Excel в VBA, я узнал, что когда я извлекаю данные из MSSQL, а затем использую get_range и .Value2 , применяю их из диапазон, любое значение типа uniqueidentifier (GUID) привело к этой ошибке. Только когда я привел значение к nvarcahr (max) , это сработало.


Я столкнулся с аналогичной ошибкой при запуске Excel в VBA, я узнал, что когда я извлекаю данные из MSSQL, а затем использую get_range и .Value2 применить его вне диапазона, любое значение типа uniqueidentifier (GUID) привело к этой ошибке. Только когда я привел значение к nvarcahr (max) , это сработало.


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

Трудно найти ошибку — слишком много строк в файле .xls (старый Excel).

Протестируйте: вручную откройте затронутый файл с помощью рабочего стола Excel.

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


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

Трудно обнаружить ошибку — слишком много строк в файле .xls (старый Excel).

Протестируйте: вручную откройте затронутый файл с помощью рабочего стола Excel.

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


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

FYI, чтобы узнать, правильно ли подписана ваша dll, вы должны щелкнуть по ней правой кнопкой мыши и перейти к подписи, и она будет сказать вам, правильно ли он подписан электронным способом.


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

FYI, чтобы узнать, правильно ли подписана ваша dll, вы должны щелкнуть по ней правой кнопкой мыши и перейти к подписи, и она будет сказать вам, правильно ли он подписан электронным способом.

Оцените статью
techsly.ru
Добавить комментарий