2017-01-31 20 views
2

私は、Excelは、テーブルtblPhoneCodeで2列CountryCodeでファイルを持っている、と私は、リストデータ検証がCountry列を指していると、セルB1を持っているEPPlusが#VALUEを返す!代わりに、セルの内容のOFFSET式で使用する場合、間接&MATCH

enter image description here

とセルB2基本的には、選択されたCountryためCodeを表示します。

enter image description here

セルB2は、次の式を使用してExcelで

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

すべてはそれが必要として動作しますが、私はC#でEPPlusを使用してB2の値を読んでいたときに、問題は、私は#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! 

すべてのヘルプや洞察力がはるかに高く評価され、私はEPPlus 4.1.0、MSエクセル2010、.NET 4.0を使用して、およびWindows 10の64ビットいます

enter image description here:スプレッドシートの迅速なレプリカを作成し

+0

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

+0

'.ToString()'と同じ結果を試しました。出力を参照してください。私は '.Text'を試してみました – Ash

+0

なぜ、C#で値を読み込むのではなく、単に国(国名)のキーを読み、辞書から値を取得するのではなく、辞書を使用しないでください –

答えて

1

と同じ結果が得られました。セルB2の値は#VALUE!です。 ドキュメンテーション/ EPPlusのソースコードの例を読むと、驚くべきことに、バグや 'フィーチャー'のように見えます。他のExcelWorksheetExcelWorkbookメンバーの一部を経て、そして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

関連する問題