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 | *******************************************************************************/
|
---|
25 | using System;
|
---|
26 | using System.Collections.Generic;
|
---|
27 | using System.Linq;
|
---|
28 | using System.Text;
|
---|
29 | using OfficeOpenXml.FormulaParsing.ExpressionGraph;
|
---|
30 |
|
---|
31 | namespace 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 | }
|
---|