Ошибка Excel HRESULT: 0x800A03EC при попытке получить диапазон с именем ячейки - PullRequest
16 голосов
/ 21 мая 2009

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

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

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

  • ОС: Windows Server 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: Получение ячейки для записи

protected object m_MissingValue = System.Reflection.Missing.Value;
Range range = m_WorkSheet.get_Range(cell.CellName, m_MissingValue);
// error from this method, and cell name is string.

Ответы [ 11 ]

17 голосов
/ 13 июня 2012

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

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

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

4 голосов
/ 23 января 2015

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

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

3 голосов
/ 13 июня 2017

Смысл полностью недокументированной ошибки 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.Lcked и многие другие). Эта ошибка не существует в Excel 2007 и 2010.
3 голосов
/ 08 мая 2012

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

using (var range = _excelApp.Range["Sheet Name Had Space!$A$1"].WithComCleanup())

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

using (var range = _excelApp.Range["'Sheet Name Had Space'!$A$1"].WithComCleanup())
3 голосов
/ 22 июля 2009

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

Edit:

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

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

и / или

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

РЕШЕНИЕ 1:


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

//declare a variable to hold the CurrentCulture
System.Globalization.CultureInfo oldCI;
//get the old CurrenCulture and set the new, en-US
void SetNewCurrentCulture()
{
  oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
  System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
}
//reset Current Culture back to the originale
void ResetCurrentCulture()
{
  System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
}

РЕШЕНИЕ 2:


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

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

yourRange.Value2 = "10/10/09"

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

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

1 голос
/ 22 августа 2013

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

0 голосов
/ 06 июня 2018

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

0 голосов
/ 31 октября 2017

Используя ответ Доминика, я обнаружил, что ответом на мою проблему, в частности, был неверный 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;
}

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

0 голосов
/ 11 апреля 2015

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

0 голосов
/ 21 июня 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...