3

我有一个带有表格tblPhoneCode和两列Country的Excel 文件Code,并且我有一个带有列表数据验证的单元格 B1 指向该Country

在此处输入图像描述

和一个单元格 B2 基本上它显示Code选定的Country.

在此处输入图像描述

单元格 B2 使用以下公式

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

Excel 中的所有内容都可以正常工作,但问题是当我在 C# 中使用 EPPlus 读取 B2 的值时,我得到#VALUE!的不是实际的 Phone 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 64bit

4

2 回答 2

3

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

在此处输入图像描述

并确认您得到的结果相同 - 单元格B2的值为#VALUE!. 通过阅读文档/EPPlus 源代码示例,结果令人惊讶,看起来像是一个错误或“功能”。浏览了其他一些成员,发现设置ExcelWorksheet属性可以解决问题ExcelWorkbookExcelWorkbook.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默认(不设置属性)似乎也可以正常工作,并提供所需的输出。

于 2017-02-01T21:32:32.907 回答
1

最初发布问题时可能不存在此文档或功能,但我遇到了同样的问题并尝试了互联网上的所有建议。如果您访问“一些常见错误”部分下的 EPPlus Wiki ,您会发现:

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

最初,我的代码看起来像:

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

删除前导 = 符号时:

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

工作表在 Excel 中完美加载(即使在安全模式下),所有公式在必须“启用编辑”之前计算

于 2018-08-23T16:37:20.890 回答