2009-05-21 10 views
16

Pracuję z projektem Window Service. które muszą zapisywać dane do arkusza w pliku Excel w sekwencji sekwencji.Błąd programu Excel HRESULT: 0x800A03EC podczas próby uzyskania zasięgu z nazwą komórki

Ale czasami, tylko czasami, usługa wyrzuca wyjątek "Wyjątek od HRESULT: 0x800A03EC", podczas gdy próbuje uzyskać zasięg z nazwą komórki.

Położyłem kod otwierającego arkusza Excela i umieszczając tutaj komórkę.

  • OS: Serwer okno 2003 Biuro:
  • Microsoft Office 2003 SP2

1: Otwarcie excel arkusz

m_WorkBook = m_WorkBooks.Open(this.FilePath, 0, false, 5, 
    "", "", true, Excels.XlPlatform.xlWindows, ";", 
    true, false, 0, true, 0, 0); 

2: Uzyskanie komórek napisać

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. 
+0

sposób, w jaki mówisz "tylko czasami", powoduje, że myślę o odpowiedzi na to: http://stackoverflow.com/questions/20422387/adding-formula-to-cell-exception-from-hresult-0x800a03ec/26591841# 26591841 –

+0

Mam ten sam problem W kodzie C# wpisałem 'xApp.Cells (3, 1) .FormulaR1C1 =" = SUM (R [-2] C: R [-1] C) "': kończy się niepowodzeniem; następnie 'xApp.Cells (3, 1) .FormulaR1C1 =" = (R [-2] C + R [-1] C) "': zawiedzie; a następnie 'xApp.Cells (3, 1) .FormulaR1C1 =" = A1 + A2 "' sukces –

Odpowiedz

17

kod błędu 0x800A03EC (lub - 2146827284) oznacza NAME_NOT_FOUND; innymi słowy, prosiłeś o coś, a Excel nie może go znaleźć.

Jest to ogólny kod, który można zastosować do wielu rzeczy, których nie można znaleźć, np. użycie właściwości, które nie są w tym czasie ważne, np. PivotItem.SourceNameStandard, wyrzuca je, gdy element PivotItem nie ma zastosowanego filtru. Worksheets["BLAHBLAH"] wyrzuca to, gdy arkusz nie istnieje itp. Ogólnie rzecz biorąc, pytasz o coś o określonej nazwie i nie istnieje. Jeśli chodzi o przyczyny, to zajmiesz się kopaniem z Twojej strony.

Sprawdź, czy twój arkusz zdecydowanie ma zasięg, o który prosisz, lub, że .CellName zdecydowanie zwraca nazwę zakresu, o który pytasz.

+3

możesz podać odniesienie do potwierdzenia oświadczenia, że ​​"Kod błędu 0x800A03EC (lub -2146827284) oznacza NAME_NOT_FOUND"? Nie udało mi się znaleźć ... – ForeverWintr

+0

@ForeverWintr: Próbuję wykopać link, ale ta odpowiedź pochodzi sprzed 10 miesięcy i bazuje na moich badaniach w tym czasie. Od pewnego czasu buduję też oparte na Excelu rozwiązanie VSTO i widziałem to całkiem sporo, gdy nie mogę zlokalizować przedmiotu według nazwy, zakresu itp. Jest to bardzo ogólny błąd, więc może pojawić się w innych aplikacjach Office i znaczy coś różne (jak zapisywanie plików, błędy automatyzacji), ale jeśli nie działa w tym OP, pomogło mi rozwiązać podobne problemy w przeszłości. –

+0

Powodem, dla którego pytam jest to, że spotkałem się z 0x800A03EC z taką częstotliwością iz tak różnorodnego zakresu wywołań w moim projekcie VSTO, że zaczynam myśleć, że to po prostu oznacza "błąd Excela". Twoja odpowiedź jest jedynym odnośnikiem do "NAME_NOT_FOUND", z którym się zetknąłem. – ForeverWintr

3

Znalazłem możliwego zolu ution tutaj: http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15

Edit:

Jeśli zautomatyzować Microsoft Excel za pomocą Visual Basic .NET, Microsoft Visual C# .NET lub Microsoft Visual C++, może pojawić się następujące błędy podczas wywoływania pewnych metod, ponieważ maszyna posiada locale ustawione na czymś innym niż angielski (ID narodowe lub LCID 1033):

Wyjątek od HRESULT: 0x800A03EC

i/lub

Old formacie lub nieprawidłowy typ biblioteki

ROZWIĄZANIE 1:


Aby obejść ten błąd można ustawić CurrentCulture do en-US podczas wykonywania kodu związanego z Excela i przywrócone do originale za pomocą tych 2 funkcje.

//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; 
} 

Rozwiązanie 2:


Innym rozwiązaniem, które może pracować, należy utworzyć katalog 1033 pod Microsoft Office \ Office11 (lub odpowiadające biuro wersja), skopiuj excel.exe do katalogu 1033, i zmień jego nazwę na xllex.dll.

Mimo że można rozwiązać problem za pomocą jednego off tych rozwiązań, po wywołaniu modelu obiektów programu Excel w locale innym niż angielski w USA, model obiektowy programu Excel może działać inaczej, a kod może zawieść w sposób, o którym nie pomyślałbyś . Na przykład możesz mieć kod, który ustawia wartość zakresu na datę:

yourRange.Value2 = „10/10/09”

zależności od lokalizacji kod ten może działać w różny sposób w wyniku oddania do Excela w zakresie żadnej z następujących wartości:

10 października 2009 Wrzesień 10, 2009 października 9, 2010

+0

Rozwiązanie 1 zadziałało dla mnie. W języku francuskim odpowiednikiem słowa "SUM" jest "SOMME". Mówiłem '' SUM' przez C# do mojego Excela przetłumaczone na angielski. Formuła była OK, ale program Excel powiedział: "# NAME". Po dwukrotnym kliknięciu komórki i naciśnięciu ENTER bez żadnych zmian, Excel podał wynik formuły. Wysłanie 'SOMME' w C# wyprowadziło' SUMA'. Tak więc rozwiązanie 1 pozwoliło mi wysłać komunikat "SUM" bez błędu. –

0

Napotkano ten kod błędu podczas wyliczania nazw i wywoływania pliku worksheet.get_Range (name). Wydaje się, że występuje, gdy nazwa NIE ma zastosowania do zakresu, w moim przypadku jest to nazwa makra.

2

mam błąd z spację w nazwie arkusza:

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

Naprawiłem go poprzez umieszczenie apostrofów wokół nazwy arkuszy ze spacjami:

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

Jeśli możesz skopiować cały wyjątek byłoby znacznie lepiej, ale raz spotkałem się z tym wyjątek, a to dlatego, że funkcja wywoływania z pliku dll, który jak sądzę, Aspose.dll nie został podpisany dobrze. Myślę, że to byłby możliwy duplikat this

FYI, aby dowiedzieć się, czy twoja biblioteka dll nie została podpisana dobrze, powinieneś kliknąć to prawym przyciskiem myszy i przejść do signiture, a on powie ci, czy ma elektronicznie podpisane, czy nie.

1

Miałem ten problem, gdy próbowałem użyć funkcji range.AddComment(). Byłem w stanie rozwiązać ten problem, wywołując range.ClearComment() przed dodaniem komentarza.

4

Wystąpił ten błąd, ponieważ próbowałem napisać ciąg do komórki, która rozpoczęła się od "=".

Rozwiązaniem było wstawienie "" (apostrofu) przed znakiem równości, co jest sposobem na wyróżnienie, że w rzeczywistości nie próbujesz napisać wzoru, a po prostu chcesz wydrukować równe znaki znak.

0

Dostałem to, gdy zapomniałem odłączyć skoroszyt lub arkusz.

0

Znaczenie całkowicie nieudokumentowanego błędu (wstyd na Microsoft!) Jest podobne do "OPERACJI NIEOBSŁUGIWANEJ".

Może się zdarzyć

  • podczas otwierania dokumentu, który ma zawartość utworzoną przez nowszej wersji programu Excel, którego aktualna wersja Excel nie rozumie.
  • po zapisaniu dokumentu w tym samym katalogu, w którym został załadowany go z (plik jest już otwarty i zamknięty)

Ale przede wszystkim widać ten błąd z powodu poważnych błędów w programie Excel.

  • Na przykład Microsoft.Office.Interop.Excel.Picture ma właściwość "Włączone". Kiedy go wywołasz, powinieneś otrzymać wartość bool. Zamiast tego pojawia się błąd 800A03EC. To jest błąd.
  • I jest bardzo gruby błąd w Exel 2013 i 2016: Gdy zautomatyzujesz proces Excela i ustawisz Application.Visible=true i Application.WindowState = XlWindowState.xlMinimized, otrzymasz setki błędów 800A03EC z różnych funkcji (takich jak Range.Merge(), CheckBox.Text, Shape.TopLeftCell, Shape.Locked i wiele innych). Ten błąd nie istnieje w programach Excel 2007 i 2010.
0

Użycie odpowiedzi Dominika Znalazłem odpowiedź na mój problem w szczególności był nieprawidłowy DateTiime w danych źródłowych, zanim został zastosowany do zakresu. Gdzieś pomiędzy bazą danych .NET i Excel konwersja daty domyślnie na "1/1/1899 12:00:00 AM". Musiałem to sprawdzić i przekonwertować na pusty ciąg i naprawił to dla mnie.

if (objectArray[row, col].ToString() == "1/1/1899 12:00:00 AM") 
{ 
    objectArray[row, col] = string.Empty; 
} 

Prawdopodobnie jest to bardzo specyficzny przykład, ale mam nadzieję, że będzie to zaoszczędzić kogoś jakiś czas, jeśli starają się wyśledzić kawałek nieprawidłowych danych.

Powiązane problemy