总和最大数字EPPlus

时间:2018-02-19 13:52:47

标签: c# .net epplus epplus-4

我试图将一个范围的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函数不接受数组作为第二个参数。

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

3 个答案:

答案 0 :(得分:1)

我有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 Large function using EPPLUS

答案 1 :(得分:0)

看起来这种公式仅在将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

答案 2 :(得分:0)

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