Je travaille avec le projet Windows Service. qui doivent écrire des données sur une feuille dans un fichier Excel dans une séquence fois.
Mais parfois, parfois, le service lève l'exception "Exception de HRESULT: 0x800A03EC" pendant qu'il essaie d'obtenir une plage avec le nom de la cellule.
J'ai mis le code d'ouverture feuille Excel, et obtenir la cellule ici.
1: Ouvrir une feuille Excel
m_WorkBook = m_WorkBooks.Open(this.FilePath, 0, false, 5,
"", "", true, Excels.XlPlatform.xlWindows, ";",
true, false, 0, true, 0, 0);
2: Obtenir une cellule pour écrire
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.
Le code d'erreur 0x800A03EC
(ou -2146827284) signifie NAME_NOT_FOUND; En d'autres termes, vous avez demandé quelque chose et Excel ne le trouve pas.
C’est un code générique, qui peut s’appliquer à beaucoup de choses qu’il ne trouve pas, par exemple. L'utilisation de propriétés qui ne sont pas valides à ce moment-là, comme PivotItem.SourceNameStandard
, le renvoie lorsqu'un élément de tableau croisé dynamique n'a pas de filtre appliqué. Worksheets["BLAHBLAH"]
jette ceci, lorsque la feuille n'existe pas, etc. En général, vous demandez quelque chose avec un nom spécifique et cela n'existe pas. Quant à savoir pourquoi, cela vous demandera de creuser.
Vérifiez que votre feuille a bien la plage que vous demandez, ou que le .CellName
donne définitivement le nom de la plage que vous demandez.
J'ai rencontré cette erreur parce que je tentais d'écrire une chaîne dans une cellule qui commençait par un "=".
La solution a été de mettre un "'" (apostrophe) avant le signe égal, ce qui est un moyen de dire à Excel que vous n'essayez pas en fait d'écrire une formule et que vous souhaitez simplement imprimer le signe égal.
J'ai trouvé une solution possible ici: http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15
Modifier:
Si vous automatisez Microsoft Excel avec Microsoft Visual Basic .NET, Microsoft Visual C # .NET ou Microsoft Visual C++, les erreurs suivantes peuvent s'afficher lorsque vous appelez certaines méthodes, car l'environnement local est défini sur autre chose que l'anglais des États-Unis (ID régional ou LCID 1033):
Exception de HRESULT: 0x800A03EC
et/ou
Ancien format ou bibliothèque de types non valide
SOLUTION 1:
Pour contourner cette erreur, vous pouvez définir CurrentCulture sur en-US lors de l’exécution de code lié à Excel et revenir à votre version originale à l’aide de ces 2 fonctions.
//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;
}
SOLUTION 2:
Une autre solution pouvant fonctionner, créez un répertoire 1033 sous Microsoft Office\Office11 (ou votre version bureautique correspondante), copiez Excel.exe dans le répertoire 1033 et renommez-le en xllex.dll.
Bien que vous puissiez résoudre le problème en utilisant l'une de ces solutions, lorsque vous appelez le modèle d'objet Excel dans des environnements locaux autres que l'anglais américain, le modèle d'objet Excel peut agir différemment et votre code peut échouer de manière inattendue. Par exemple, vous pourriez avoir un code qui définit la valeur d'une plage à une date:
yourRange.Value2 = "10/10/09"
Selon les paramètres régionaux, ce code peut agir différemment, entraînant Excel à placer l'une des valeurs suivantes dans la plage:
10 octobre 2009 10 septembre 2009 9 octobre 2010
La signification de l'erreur 800A03EC (honte sur Microsoft!) Complètement undocumented ressemble à quelque chose comme "OPERATION NOT SUPPORTED".
Ça peut arriver
Mais surtout, vous verrez cette erreur en raison de graves bugs dans Excel.
Application.Visible=true
et Application.WindowState = XlWindowState.xlMinimized
, vous obtenez des centaines d'erreurs 800A03EC provenant de différentes fonctions (telles que Range.Merge (), CheckBox.Text, Shape.TopLeftCell , Shape.Locked et beaucoup plus). Ce bogue n'existe pas dans Excel 2007 et 2010.J'ai eu l'erreur avec un espace dans un nom de feuille:
using (var range = _excelApp.Range["Sheet Name Had Space!$A$1"].WithComCleanup())
Je l'ai corrigé en mettant des guillemets simples autour des noms de feuille avec des espaces:
using (var range = _excelApp.Range["'Sheet Name Had Space'!$A$1"].WithComCleanup())
J'ai eu ce problème lorsque j'essayais d'utiliser la fonction range.AddComment (). J'ai pu résoudre ce problème en appelant range.ClearComment () avant d'ajouter le commentaire.
Je l'ai eu quand j'ai oublié de déprotéger un classeur ou une feuille.
En utilisant la réponse de Dominic, j'ai trouvé que la réponse à mon problème était spécifiquement une DateTiime non valide dans les données source avant son application à la plage. Quelque part entre la base de données, .NET et Excel, la conversion de la date par défaut est "1/1/1899 12:00:00 AM". Je devais le vérifier et le convertir en une chaîne vide et le réparer pour moi.
if (objectArray[row, col].ToString() == "1/1/1899 12:00:00 AM")
{
objectArray[row, col] = string.Empty;
}
C'est probablement un exemple assez spécifique, mais j'espère que cela permettra à quelqu'un d'autre de gagner un peu de temps s'il tente de retrouver une donnée invalide.
J'ai rencontré une erreur similaire lors de l'exécution d'Excel dans VBA. Ce que j'ai appris, c'est que lorsque je récupère des données à partir de MSSQL, puis que j'utilise get_range
et .Value2
, toutes les valeurs de type uniqueidentifier
(GUID) résultent: cette erreur. Ce n'est que lorsque j'ai converti la valeur en nvarcahr(max)
que cela a fonctionné.
J'ai rencontré ce code d'erreur lors de l'énumération des noms et de l'appel à worksheet.get_Range (name). Cela semble se produire lorsque le nom NE s'applique PAS à une plage. Dans mon cas, il s'agit du nom d'une macro.