Подтвердить что ты не робот

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

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.
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Edit:

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

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

и/или

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

РЕШЕНИЕ 1:


Чтобы обойти эту ошибку, вы можете установить CurrentCulture в en-US при выполнении кода, связанного с Excel и reset, обратно к вашему оригиналу, используя эти 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 (или соответствующую офисную версию), скопируйте excel.exe в каталог 1033 и переименуйте его в xllex.dll.

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

yourRange.Value2 = "10/10/09"

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

Значение полностью недокументированной ошибки 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.

Ответ 9

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

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

Ответ 10

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

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