2017-01-31 1 views
2

У меня есть Excel файл с таблицей tblPhoneCode и с двумя колоннами Country и Code, и у меня есть ячейки B1 с List Data Validation указывая на Country колонкиEPPlus возвращает #VALUE! вместо содержимого ячейки при использовании формулы OFFSET, КОСВЕННЫЙ & MATCH

enter image description here

и ячейка B2 в основном он отображает Code для выбранного Country.

enter image description here

Cell B2 использует следующую формулу

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

Все в Excel работает как надо, но вопрос, когда я читаю значение В2 с использованием EPPlus в C# Я получаю #VALUE! вместо фактического телефона Code. Я пробовал .Calculate() из рабочей книги, рабочего листа, в ячейку и пытался получить доступ к значению, все тот же. Я подключил регистратор, и он становится пустым, и в нем нет ошибки.

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(); 
    } 
} 

Выход:

Country: US 
Phone Code: #VALUE! 

Любая помощь или понимание очень ценится, я использую MS Excel 2010, .NET 4.0, EPPlus 4.1.0 и Windows, 10 64-битной

+0

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

+0

Я попытался использовать и без '.ToString()' тот же результат, см. Выход. Я даже попробовал '.Text' – Ash

+0

Я вижу, почему бы не использовать словарь в C# вместо чтения значения (код страны), просто прочитайте ключ (название страны) и получите значение из словаря –

ответ

1

создал быструю копию таблицы:

enter image description here

и подтвердил те же результаты, что и вы, - ячейка B2 имеет значение #VALUE!. Из чтения примеров документации/EPPlus исходный код, результат удивителен и выглядит как ошибка или функция '. Ехали через некоторые другие ExcelWorksheet и ExcelWorkbook членов, и обнаружили, установив ExcelWorkbook.FullCalcOnLoad свойство решает проблему:

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()); 
} 

Выход:

Country:  Germany 
Phone Code:  49 

UPDATE: После отправки сообщения, проверяется значение по умолчанию от FullCalcOnLoad, который появляется быть true. И действительно, удаление обоих вызовов Calculate() и оставление FullCalcOnLoad по умолчанию (не задание свойства), похоже, также работает, и дает желаемый результат.

+0

Когда я изначально начал работу, это не сработало, поэтому я попробовал.Calculate() и все еще не работает, то теперь он снова работает без .Calculate(), я озадачен. – Ash

+0

@Ash - Согласен. Из чтения документации и [примеров исходного кода на codeplex] (https://epplus.codeplex.com/wikipage?title=About%20Formula%20calculation), я бы _expect_, что 'Calculate()' необходимо .... – kuujinbo

Смежные вопросы