gpt4 book ai didi

c# - EPPlus 返回#VALUE!与公式 OFFSET、INDIRECT 和 MATCH 一起使用时代替单元格内容

转载 作者:行者123 更新时间:2023-11-30 23:16:33 24 4
gpt4 key购买 nike

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

enter image description here

和单元格 B2 基本上显示所选 CountryCode

enter image description here

单元格 B2 使用以下公式

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

Excel 中的一切都正常工作,但问题是当我在 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!

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

最佳答案

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

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 保留为默认值(不设置属性)似乎也有效,并提供所需的输出。

关于c# - EPPlus 返回#VALUE!与公式 OFFSET、INDIRECT 和 MATCH 一起使用时代替单元格内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41950120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com