Free cookie consent management tool by TermsFeed Policy Generator

source: stable/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/EPPlus-4.0.3/FormulaParsing/Excel/Functions/Math/Subtotal.cs

Last change on this file was 12074, checked in by sraggl, 10 years ago

#2341: Added EPPlus-4.0.3 to ExtLibs

File size: 4.4 KB
Line 
1/* Copyright (C) 2011  Jan Källman
2 *
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
7
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
11 * See the GNU Lesser General Public License for more details.
12 *
13 * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
14 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
15 *
16 * All code and executables are provided "as is" with no warranty either express or implied.
17 * The author accepts no liability for any damage or loss of business that this product may cause.
18 *
19 * Code change notes:
20 *
21 * Author             Change            Date
22 *******************************************************************************
23 * Mats Alm                       Added                   2013-12-03
24 *******************************************************************************/
25using System;
26using System.Collections.Generic;
27using System.Linq;
28using System.Text;
29using OfficeOpenXml.FormulaParsing.ExpressionGraph;
30
31namespace OfficeOpenXml.FormulaParsing.Excel.Functions.Math
32{
33    public class Subtotal : ExcelFunction
34    {
35        private Dictionary<int, HiddenValuesHandlingFunction> _functions = new Dictionary<int, HiddenValuesHandlingFunction>();
36       
37        public Subtotal()
38        {
39            Initialize();
40        }
41
42        private void Initialize()
43        {
44            _functions[1] = new Average();
45            _functions[2] = new Count();
46            _functions[3] = new CountA();
47            _functions[4] = new Max();
48            _functions[5] = new Min();
49            _functions[6] = new Product();
50            _functions[7] = new Stdev();
51            _functions[8] = new StdevP();
52            _functions[9] = new Sum();
53            _functions[10] = new Var();
54            _functions[11] = new VarP();
55
56            AddHiddenValueHandlingFunction(new Average(), 101);
57            AddHiddenValueHandlingFunction(new Count(), 102);
58            AddHiddenValueHandlingFunction(new CountA(), 103);
59            AddHiddenValueHandlingFunction(new Max(), 104);
60            AddHiddenValueHandlingFunction(new Min(), 105);
61            AddHiddenValueHandlingFunction(new Product(), 106);
62            AddHiddenValueHandlingFunction(new Stdev(), 107);
63            AddHiddenValueHandlingFunction(new StdevP(), 108);
64            AddHiddenValueHandlingFunction(new Sum(), 109);
65            AddHiddenValueHandlingFunction(new Var(), 110);
66            AddHiddenValueHandlingFunction(new VarP(), 111);
67        }
68
69        private void AddHiddenValueHandlingFunction(HiddenValuesHandlingFunction func, int funcNum)
70        {
71            func.IgnoreHiddenValues = true;
72            _functions[funcNum] = func;
73        }
74
75        public override void BeforeInvoke(ParsingContext context)
76        {
77            base.BeforeInvoke(context);
78            context.Scopes.Current.IsSubtotal = true;
79        }
80
81        public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context)
82        {
83            ValidateArguments(arguments, 2);
84            var funcNum = ArgToInt(arguments, 0);
85            if (context.Scopes.Current.Parent != null && context.Scopes.Current.Parent.IsSubtotal)
86            {
87                return CreateResult(0d, DataType.Decimal);
88            }
89            var actualArgs = arguments.Skip(1);
90            ExcelFunction function = null;
91            function = GetFunctionByCalcType(funcNum);
92            var compileResult = function.Execute(actualArgs, context);
93            compileResult.IsResultOfSubtotal = true;
94            return compileResult;
95        }
96
97        private ExcelFunction GetFunctionByCalcType(int funcNum)
98        {
99            if (!_functions.ContainsKey(funcNum))
100            {
101                ThrowExcelErrorValueException(eErrorType.Value);
102                //throw new ArgumentException("Invalid funcNum " + funcNum + ", valid ranges are 1-11 and 101-111");
103            }
104            return _functions[funcNum];
105        }
106    }
107}
Note: See TracBrowser for help on using the repository browser.