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

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

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

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

  • ОС: Windows server 2003 Office:
  • Microsoft Office 2003 с пакетом обновления 2

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 ответов


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

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

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


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

решение состояло в том, чтобы поставить "'" (апостроф) перед знаком равенства, что является способом сказать excel, что вы на самом деле не пытаетесь написать формулу, а просто хотите напечатать знак равенства.


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

Edit:

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

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

и/или

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

Решение 1:


чтобы обойти эту ошибку, вы можете установить CurrentCulture в en-US при выполнении кода, связанного с Excel, и сбросить его обратно в originale с помощью этих 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 г.


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

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

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

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

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


значение полностью без документов ошибка 800A03EC (позор Microsoft!) что-то вроде "операция не поддерживается".

Это может случиться

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

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

  • например Microsoft.Офис.Взаимодействие.Превосходить.Картинка имеет свойство "включено". Когда вы вызываете его, вы должны получить значение bool. Но вместо этого вы получаете ошибку 800A03EC. Это жучок.
  • и есть очень жирная ошибка в Exel 2013 и 2016: когда вы автоматизируете процесс Excel и установите Application.Visible=true и Application.WindowState = XlWindowState.xlMinimized тогда вы получите сотни ошибок 800A03EC из разных функций (например, Диапазон.Merge(), Флажок.Текст, Форма.TopLeftCell, Форму.Locked и многие другие). Эта ошибка не существует в Excel 2007 и 2010.

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


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


С помощью ответа Доминика я нашел ответ на мою проблему конкретно инвалид DateTiime в источнике данных был применен к серии. Где-то между базой данных, .NET и Excel преобразование даты по умолчанию снизилось до "1/1/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) это сработало.


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

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