总和n最大的数字EPPlus(Sum n largest numbers EPPlus)

编程入门 行业动态 更新时间:2024-10-12 10:17:47
总和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()

看起来大函数不接受数组作为第二个参数。

我如何获得EPPlus中n个最大值公式的总和?

I'm trying to sum the n largest numbers of a range.

My formula is: SUM(LARGE(A10:A15, {1,2}))

But I'm getting a #VALUE as result.

If I debug the formula execution to a log file I got that:

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

Looks like the Large Function doesn't accept an array as a second argument.

How can I get the sum of n largest values formula in EPPlus?

最满意答案

我有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使用EPPLUS的大功能

Looks like this kind of formula only works when save the excel to file. In my case I don't want a file, just the calculated value.

The solution was to extend de ExcelFunction class and create my own implementation:

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

Then I added it to my package:

using (ExcelPackage excelPackage = new ExcelPackage()) { excelPackage.Workbook.FormulaParserManager.AddOrReplaceFunction("SUMLARGEST", new SumLargest()); .... }

And I can use it in a much better way then the original formula:

Cells["C5"].Formula = "SUMLARGEST(A10:A15, 2)"

Reference: https://github.com/JanKallman/EPPlus/wiki/Implementing-missing-or-new-Excel-functions

更多推荐

本文发布于:2023-08-07 13:23:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1464529.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:总和   数字   EPPlus   numbers   largest

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!