EPPlus returns #VALUE!与公式 OFFSET、INDIRECT 和 MATCH 一起使用时代替单元格内容
EPPlus returns #VALUE! instead of the cell content when used with Formula OFFSET, INDIRECT & MATCH
我有一个 Excel 文件,其中包含 table tblPhoneCode
和两列 Country
和 Code
,并且我有一个包含列表的单元格 B1指向 Country
列的数据验证
和单元格 B2 基本上显示所选 Country
的 Code
。
单元格 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 64 位
创建了电子表格的快速副本:
并确认您得到的结果相同 - 单元格 B2
的值为 #VALUE!
。 通过阅读文档/EPPlus 源代码示例,结果令人惊讶,看起来像一个错误或“feature”。通过其他一些 ExcelWorksheet
和 ExcelWorkbook
成员,发现设置 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
默认值(不设置 属性)似乎也有效,并提供所需的输出。
也许问题最初发布时这个文档或功能不存在,但我 运行 遇到了同样的问题并尝试了互联网上的所有建议。如果您转到 "Some Common Mistakes" 部分下的 EPPlus Wiki,您会发现:
Don't add the leading = sign in your formula. "=SUM(A1:A2)" is wrong, "SUM(A1:A2)" is correct.
最初,我的代码如下所示:
sheet.Cells["A1"].Formula = "=SUM(A2:A5)";
删除前导 = 号时:
sheet.Cells["A1"].Formula = "SUM(A2:A5)";
sheet 在 Excel 中完美加载(即使在安全模式下),所有公式在必须 "Enable Editing"
之前计算
我有一个 Excel 文件,其中包含 table tblPhoneCode
和两列 Country
和 Code
,并且我有一个包含列表的单元格 B1指向 Country
列的数据验证
和单元格 B2 基本上显示所选 Country
的 Code
。
单元格 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 64 位
创建了电子表格的快速副本:
并确认您得到的结果相同 - 单元格 B2
的值为 #VALUE!
。 通过阅读文档/EPPlus 源代码示例,结果令人惊讶,看起来像一个错误或“feature”。通过其他一些 :ExcelWorksheet
和 ExcelWorkbook
成员,发现设置 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
默认值(不设置 属性)似乎也有效,并提供所需的输出。
也许问题最初发布时这个文档或功能不存在,但我 运行 遇到了同样的问题并尝试了互联网上的所有建议。如果您转到 "Some Common Mistakes" 部分下的 EPPlus Wiki,您会发现:
Don't add the leading = sign in your formula. "=SUM(A1:A2)" is wrong, "SUM(A1:A2)" is correct.
最初,我的代码如下所示:
sheet.Cells["A1"].Formula = "=SUM(A2:A5)";
删除前导 = 号时:
sheet.Cells["A1"].Formula = "SUM(A2:A5)";
sheet 在 Excel 中完美加载(即使在安全模式下),所有公式在必须 "Enable Editing"
之前计算