2017-01-31 1 views
2

J'ai un fichier Excel avec une table tblPhoneCode et avec deux colonnes Country et Code, et j'ai une cellule B1 avec liste de validation de données pointant vers la colonne CountryEPPlus renvoie #VALUE! au lieu du contenu cellulaire lorsqu'il est utilisé avec la Formule OFFSET, INDIRECT & MATCH

enter image description here

et une cellule B2, il affiche essentiellement la Code pour le Country sélectionné.

enter image description here

cellule B2 utilise la formule suivante

OFFSET(INDIRECT("tblPhoneCode[#Headers]"),MATCH(B1,INDIRECT("tblPhoneCode[Country]"),0),1,1,1) 

Tout dans Excel fonctionne comme il se doit, mais la question est quand je lis la valeur de B2 en utilisant EPPlus en C# Je reçois #VALUE! au lieu du téléphone réel Code. J'ai essayé .Calculate() à partir du classeur, feuille de calcul, à la cellule et essayé d'accéder à la valeur est toujours la même. J'ai attaché l'enregistreur et il apparaît vide et il n'y a pas d'erreur connecté.

code C#

static void Main(string[] args) 
{ 
    var excelFile = new FileInfo(@"C:\Users\Ash\Desktop\Epplus.xlsx"); 
    using (var package = new ExcelPackage(excelFile)) 
    { 
     // Output from the logger will be written to the following file 
     var logfile = new FileInfo(@"C:\Users\Ash\Desktop\EpplusLogFile.txt"); 
     // Attach the logger before the calculation is performed. 
     package.Workbook.FormulaParserManager.AttachLogger(logfile); 
     // Calculate - can also be executed on sheet- or range level. 
     package.Workbook.Calculate(); 

     Debug.Print(String.Format("Country: \t{0}", package.Workbook.Worksheets[1].Cells["B1"].Value)); 
     Debug.Print(String.Format("Phone Code:\t{0}", package.Workbook.Worksheets[1].Cells["B2"].Value)); 

     // The following method removes any logger attached to the workbook. 
     package.Workbook.FormulaParserManager.DetachLogger(); 
    } 
} 

Sortie:

Country: US 
Phone Code: #VALUE! 

Tout est beaucoup apprécié l'aide ou un aperçu, j'utilise MS Excel 2010, .NET 4.0, EPPlus 4.1.0 et Windows 10 64bit

+0

try package.Workbook.Worksheets [1] .Cells ["B2"]. Value.ToString(); –

+0

J'ai essayé avec et sans '.ToString()' même résultat, voir Sortie. J'ai même essayé '.Text' – Ash

+0

Je vois, pourquoi ne pas utiliser le dictionnaire en C# au lieu de lire la valeur (Country Code) il suffit de lire la clé (Country Name) et obtenir la valeur du dictionnaire –

Répondre

1

une réplique rapide Création de votre feuille de calcul:

enter image description here

et confirmé les mêmes résultats que vous obtenez - la cellule B2 a une valeur de #VALUE!. A la lecture de la documentation/exemples de code source EPPlus, le résultat est surprenant, et ressemble à un bug ou 'feature'. Je suis allé à travers quelques-uns des autres ExcelWorksheet et ExcelWorkbook membres et trouvé définissant la propriété ExcelWorkbook.FullCalcOnLoad résout le problème:

using (var package = new ExcelPackage(fileInfo)) 
{ 
    // UPDATED answer - doesn't look like this is needed either 
    // package.Workbook.FullCalcOnLoad = true; 
    // same result as question code if Calculate() is called instead: '#VALUE!' 
    // package.Workbook.Calculate(); 
    var ws = package.Workbook.Worksheets[1]; 
    Console.WriteLine("Country: \t{0}", ws.Cells["B1"].Value); 
    Console.WriteLine("Phone Code:\t{0}", ws.Cells["B2"].Value.ToString()); 
} 

Sortie:

Country:  Germany 
Phone Code:  49 

MISE À JOUR: Après avoir enregistré, vérifié la valeur par défaut de FullCalcOnLoad, lequel apparaît comme étant true. Et en effet, supprimer à la fois l'appel Calculate() et laisser FullCalcOnLoad à sa valeur par défaut (ne pas définir la propriété) semble fonctionner aussi bien, et donne la sortie désirée.

+0

Quand j'ai commencé initialement cela ne fonctionnait pas, alors j'ai essayé le.Calculer() et ne fonctionne toujours pas, alors maintenant il fonctionne à nouveau sans. Calculer(), je suis déconcerté. – Ash

+0

@Ash - D'accord. De la lecture de la documentation et [des exemples de code source sur codeplex] (https://epplus.codeplex.com/wikipage?title=About%20Formula%20calculation), je voudrais _expecter_ que 'Calculate()' est nécessaire .... – kuujinbo