簡體   English   中英

最多的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個最大值公式的總和?

我有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();
        }

結果:

使用EPPLUS的Excel大功能

看起來這種公式僅在將excel保存到文件時有效。 在我的情況下,我不需要文件,只是想要的計算值。

解決方案是擴展de <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

日志文件條目提供了以下信息:公式解析器無法將工作表1上單元格A9的內容轉換為整數。 這是一個舊線程,只是認為突出顯示某人是否有類似問題可能很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM