Ошибка 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, и он скажет вам, если он был подписан в электронном виде хорошо или нет.