EPPlus返回#VALUE!使用公式OFFSET时,而不是单元格内容,间接&比赛

时间:2017-01-31 05:15:38

标签: c# epplus epplus-4

我有一个包含表格tblPhoneCode和两列CountryCode的Excel文件,我有一个单元格B1,列表数据验证指向Country

enter image description here

和单元格B2基本上显示所选Code的{​​{1}}。

enter image description here

Cell B2使用以下公式

Country

Excel中的所有内容都可以正常工作,但问题是当我在C#中使用EPPlus读取B2的值时,我得到OFFSET(INDIRECT("tblPhoneCode[#Headers]"),MATCH(B1,INDIRECT("tblPhoneCode[Country]"),0),1,1,1) 而不是实际的电话#VALUE!。我已经尝试Code从工作簿,工作表到单元格并尝试访问该值仍然是相同的。我已经附加了记录器,它变为空,并且没有记录错误。

C#代码

.Calculate()

输出:

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

非常感谢任何帮助或见解,我使用的是MS Excel 2010,.NET 4.0,EPPlus 4.1.0和Windows 10 64位

2 个答案:

答案 0 :(得分:1)

创建了电子表格的快速副本:

enter image description here

并确认了您获得的相同结果 - 单元格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

<强>更新: 发布后,检查FullCalcOnLoad的默认值,其中出现true。实际上,删除Calculate()调用并将FullCalcOnLoad保留为默认值(不设置属性)似乎也可以正常工作,并提供所需的输出。

答案 1 :(得分:0)

也许最初发布问题时的此文档或功能不存在,但是我遇到了同样的问题,并尝试了Interweb上的所有建议。如果转到“一些常见错误”部分下的EPPlus Wiki,您将找到:

  

请勿在公式中添加前导=符号。 “ = SUM(A1:A2)”错误,“ SUM(A1:A2)”是正确的。

最初,我的代码如下:

sheet.Cells["A1"].Formula = "=SUM(A2:A5)";

在删除前导=符号时:

sheet.Cells["A1"].Formula = "SUM(A2:A5)";

工作表在Excel中已完美加载(即使在安全模式下也是如此),并且所有公式都必须先进行计算,然后才能“启用编辑”