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