2017-01-31 6 views
2

나는 엑셀 테이블 tblPhoneCode와 함께 두 개의 열 CountryCode로 파일을 가지고 있고, 나는 목록 데이터 유효성 검사가 Country 열을 가리키는 셀 B1이EPPlus가 # VALUE를 반환합니다! 대신 셀 내용의 OFFSET 포뮬러와 함께 사용할 때, 간접적 & MATCH

enter image description here

과는 셀 B2는 기본적으로는 상기 선택된 CountryCode 대한 표시.

enter image description here

셀 B2는 다음 공식을 사용하여 Excel에서 모든 것이 예상대로 작동하지만, 나는 나는 #VALUE! 무엇입니까 C#으로 EPPlus를 사용하여 B2의 값을 읽고있다 할 때 문제가

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

실제 전화 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 엑셀 2010, .NET 4.0, EPPlus 4.1.0 및 Windows 10 64 비트를 사용하고 있습니다 감사합니다

enter image description here :

+0

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

+0

'.ToString()'과 같은 결과를 얻으 려 시도했으나 출력을보십시오. 심지어'.Text'를 시도했습니다. – Ash

+0

C#에서 값 (국가 코드)을 읽는 대신 사전 (국가 이름) 키를 읽고 사전에서 값을 가져 오는 이유는 무엇입니까? –

답변

1

스프레드 시트의 빠른 복제본을 생성

과 같은 결과가 확인되었습니다. 셀 B2의 값은 #VALUE!입니다. documentation/EPPlus 소스 코드 예제를 읽은 결과 놀랍지 만 버그 또는 'feature'과 같이 보입니다. 다른 ExcelWorksheetExcelWorkbook 회원의 일부를 통해 갔다 및 ExcelWorkbook.FullCalcOnLoad 속성을 설정하면 문제를 해결 발견

Country:  Germany 
Phone Code:  49 

UPDATE : 게시 한 후, 기본값을 확인 출력

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

FullCalcOnLoad인데, 이는 true으로 나타납니다. 그리고 실제로 Calculate() 호출을 모두 제거하고 FullCalcOnLoad을 기본값으로 두는 것 (속성을 설정하지 않음)은 잘 작동하는 것처럼 보이고 원하는 출력을 제공합니다.

+0

처음 시작했을 때 제대로 작동하지 않았으므로 시도해 보았습니다.계산()하고 여전히 작동하지 않았다면, 이제는 계산하지 않고 다시 작업하고 있습니다.() 나는 당황합니다. – Ash

+0

@Ash - 동의합니다. 설명서 및 [codeplex의 소스 코드 예제] (https://epplus.codeplex.com/wikipage?title=About%20Formula%20calculation)를 읽으면서 Calculate()가 필요하다는 사실을 _expect_ ... 것이라고 생각했습니다. – kuujinbo