对 n 个最大数求和 EPPlus
Sum n largest numbers EPPlus
我正在尝试对一个范围内的 n 个最大数求和。
我的公式是:SUM(LARGE(A10:A15, {1,2}))
但结果是 #VALUE
。
如果我将公式执行调试到日志文件,我得到了:
Worksheet: Sheet 1
Address: A9
OfficeOpenXml.FormulaParsing.Exceptions.ExcelErrorValueException: #VALUE!
em OfficeOpenXml.FormulaParsing.Excel.Functions.IntArgumentParser.Parse(Object obj)
em OfficeOpenXml.FormulaParsing.Excel.Functions.ExcelFunction.ArgToInt(IEnumerable`1 arguments, Int32 index)
em OfficeOpenXml.FormulaParsing.Excel.Functions.Math.Large.Execute(IEnumerable`1 arguments, ParsingContext context)
em OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers.DefaultCompiler.Compile(IEnumerable`1 children, ParsingContext context)
em OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionExpression.Compile()
看起来 Large Function 不接受数组作为第二个参数。
如何在 EPPlus 中得到 n 个最大值求和公式?
我有 Excel 2016 和 EPPlus 4.1.1.0,我测试了你的工作,它运行良好。
我的猜测是您的单元格 "A10:A15" 保存的值格式不正确(可能是字符串),或者您使用的是旧版本的 EPPlus/Excel。
请通过在另一个包含数值的新列上尝试公式来检查您的数据,并尝试更新您的 EPPLUS 版本。
我使用的代码:
using (ExcelPackage pkg = new ExcelPackage(new FileInfo(@"D:\testSheet.xlsx")))
{
pkg.Workbook.Worksheets.Add("sheet");
pkg.Workbook.Worksheets.ElementAt(0).Cells["A10:A15"].Value = 2;
pkg.Workbook.Worksheets.ElementAt(0).Cells["C5"].Formula = "SUM(LARGE(A10:A15, {1,2}))";
pkg.Save();
}
结果:
看起来这种公式只有在将 excel 保存到文件时才有效。就我而言,我不需要文件,只需要计算值。
解决方案是扩展 de ExcelFunction class 并创建我自己的实现:
public class SumLargest: ExcelFunction
{
public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context)
{
ValidateArguments(arguments, 2);
//n largest values
var n = ArgToInt(arguments, 1);
var cells = ArgsToDoubleEnumerable(arguments, context);
var values = cells.ToList();
values.RemoveAt(values.Count() - 1);
var result = values
.OrderByDescending(x => x)
.Take(n)
.Sum();
return CreateResult(result, DataType.Decimal);
}
}
然后我将它添加到我的包中:
using (ExcelPackage excelPackage = new ExcelPackage())
{
excelPackage.Workbook.FormulaParserManager.AddOrReplaceFunction("SUMLARGEST", new SumLargest());
....
}
我可以用比原始公式更好的方式使用它:
Cells["C5"].Formula = "SUMLARGEST(A10:A15, 2)"
参考:https://github.com/JanKallman/EPPlus/wiki/Implementing-missing-or-new-Excel-functions
日志文件条目提供了公式解析器未能将工作表 1 上单元格 A9 的内容转换为整数的信息。这是一个旧线程,只是认为如果有人有类似的问题,突出显示它可能会有用。
我正在尝试对一个范围内的 n 个最大数求和。
我的公式是:SUM(LARGE(A10:A15, {1,2}))
但结果是 #VALUE
。
如果我将公式执行调试到日志文件,我得到了:
Worksheet: Sheet 1
Address: A9
OfficeOpenXml.FormulaParsing.Exceptions.ExcelErrorValueException: #VALUE!
em OfficeOpenXml.FormulaParsing.Excel.Functions.IntArgumentParser.Parse(Object obj)
em OfficeOpenXml.FormulaParsing.Excel.Functions.ExcelFunction.ArgToInt(IEnumerable`1 arguments, Int32 index)
em OfficeOpenXml.FormulaParsing.Excel.Functions.Math.Large.Execute(IEnumerable`1 arguments, ParsingContext context)
em OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers.DefaultCompiler.Compile(IEnumerable`1 children, ParsingContext context)
em OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionExpression.Compile()
看起来 Large Function 不接受数组作为第二个参数。
如何在 EPPlus 中得到 n 个最大值求和公式?
我有 Excel 2016 和 EPPlus 4.1.1.0,我测试了你的工作,它运行良好。
我的猜测是您的单元格 "A10:A15" 保存的值格式不正确(可能是字符串),或者您使用的是旧版本的 EPPlus/Excel。
请通过在另一个包含数值的新列上尝试公式来检查您的数据,并尝试更新您的 EPPLUS 版本。
我使用的代码:
using (ExcelPackage pkg = new ExcelPackage(new FileInfo(@"D:\testSheet.xlsx")))
{
pkg.Workbook.Worksheets.Add("sheet");
pkg.Workbook.Worksheets.ElementAt(0).Cells["A10:A15"].Value = 2;
pkg.Workbook.Worksheets.ElementAt(0).Cells["C5"].Formula = "SUM(LARGE(A10:A15, {1,2}))";
pkg.Save();
}
结果:
看起来这种公式只有在将 excel 保存到文件时才有效。就我而言,我不需要文件,只需要计算值。
解决方案是扩展 de ExcelFunction class 并创建我自己的实现:
public class SumLargest: ExcelFunction
{
public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context)
{
ValidateArguments(arguments, 2);
//n largest values
var n = ArgToInt(arguments, 1);
var cells = ArgsToDoubleEnumerable(arguments, context);
var values = cells.ToList();
values.RemoveAt(values.Count() - 1);
var result = values
.OrderByDescending(x => x)
.Take(n)
.Sum();
return CreateResult(result, DataType.Decimal);
}
}
然后我将它添加到我的包中:
using (ExcelPackage excelPackage = new ExcelPackage())
{
excelPackage.Workbook.FormulaParserManager.AddOrReplaceFunction("SUMLARGEST", new SumLargest());
....
}
我可以用比原始公式更好的方式使用它:
Cells["C5"].Formula = "SUMLARGEST(A10:A15, 2)"
参考:https://github.com/JanKallman/EPPlus/wiki/Implementing-missing-or-new-Excel-functions
日志文件条目提供了公式解析器未能将工作表 1 上单元格 A9 的内容转换为整数的信息。这是一个旧线程,只是认为如果有人有类似的问题,突出显示它可能会有用。