代码之家  ›  专栏  ›  技术社区  ›  Munir

n个最大数之和EPPlus

  •  0
  • Munir  · 技术社区  · 6 年前

    我试图求一个范围内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个最大值之和公式?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Yahya Hussein    6 年前

    我有Excel 2016和EPPlus 4.1.1.0,我测试了你的工作,它工作得很好。

    我猜测您的单元格“A10:A15”中的值格式不正确(可能是字符串),或者您使用的是旧版本的ePlus/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 Large function using EPPLUS

        2
  •  0
  •   Munir    6 年前

    看起来这种公式只有在将excel保存到文件时才有效。在我的情况下,我不需要文件,只需要计算的值。

    解决方案是扩展de ExcelFunction类并创建自己的实现:

    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

        3
  •  0
  •   swmal    6 年前

    日志文件条目提供了公式解析器无法将工作表1上单元格A9的内容转换为整数的信息。这是一个旧的线程,只是想如果有人有类似的问题,突出显示一下可能会很有用。