2017-03-15 1 views
1

J'ai une application C# qui exploite Interop.Excel (v15) pour ouvrir quelques classeurs de données client, les analyser et afficher des informations. Le problème que j'ai est que certaines des cellules du classeur ont une valeur de # N/A; qui en Excel parle est un CVErr indiquant qu'un certain type d'erreur existe. Dans le contexte de nos données clients, ils utilisent # N/A pour indiquer Non Applicable - il n'y a pas de problème de formule sous-jacente, c'est simplement la valeur qu'ils utilisent.C# Interop.Excel '# N/A' Cell Valeur convertie en -2146826246

Lorsque j'utilise les fonctions ci-dessous pour parcourir les lignes de feuille de calcul, je reçois une valeur Int de -2146826246 à chaque fois que je tombe sur un # N/A:

private void traverseRows(Excel._Worksheet worksheet) 
{ 
    //Get the used Range 
    Excel.Range usedRange = worksheet.UsedRange; 

    //Last Row/Column 
    int lastUsedRow = usedRange.Row + usedRange.Rows.Count - 1; 
    int lastUsedColumn = usedRange.Column + usedRange.Rows.Columns.Count; 

    foreach (Excel.Range row in usedRange.Rows) 
    { 
     List<String> rowData = rangeToList(row); 
    } 
} 

List<string> rangeToList(Microsoft.Office.Interop.Excel.Range inputRng) 
{ 
    object[,] cellValues = (object[,])inputRng.Value2; 
    List<string> lst = cellValues.Cast<object>().ToList().ConvertAll(x => Convert.ToString(x)); 
    return lst; 
} 

Visual Studio Debug

J'ai essayé d'examiner chaque cellule individuellement mais qui a ralenti l'application à l'endroit où elle était inutilisable (la plupart des classeurs ont 10 000 lignes X 38 colonnes). J'ai essayé de convertir en texte, valeur, & Value2 en vain. Je dois être capable de lire les valeurs # N/A dans leur forme réelle afin que je puisse exécuter des comparaisons et ensuite afficher la valeur dans un autre classeur. Quel est le meilleur moyen d'y parvenir?

+0

Au lieu de convertir en chaîne, utilisez @ verabtim pour l'obtenir comme littéral. –

+0

@SivaprasathV Où puis-je utiliser @ verbatim? Les valeurs proviennent d'un objet COM Row, même sous cette forme, elles ont la valeur -214682646 – slashNburn

Répondre

0

Peut être ci-dessous le lien vous aidera.

https://xldennis.wordpress.com/2006/11/29/dealing-with-cverr-values-in-net-part-ii-solutions/

Je ne suis pas sûr, mais juste ma suggestion est, comme -2146826246 est le code de # N/A valeur, vous pouvez vérifier la valeur de la cellule/texte pour la même et vous pouvez ajouter # N/A comme texte dans votre liste "lst".

Mais une meilleure approche consiste à utiliser OpenXml pour récupérer des données à partir d'Excel.

+1

J'avais effectivement rencontré l'article de Mike durant ma phase initiale de recherche/dépannage; l'article a plus de 10 ans et j'espérais qu'une solution plus élégante à ce problème aurait vu le jour au cours de la dernière décennie (c.-à-d. ne pas avoir à traduire manuellement tous les N/A). Je vais chercher à utiliser OpenXml. – slashNburn