@@ -12,7 +12,7 @@ public class ExcelSheetSelection : NotifyPropertyChangedBaseClass
12
12
private readonly static Regex simpleColumnRegex = new Regex ( "^[A-Z]+$" , RegexOptions . Compiled ) ;
13
13
private readonly static Regex simpleRowRegex = new Regex ( "^[1-9][0-9]*$" , RegexOptions . Compiled ) ;
14
14
private readonly static Regex rangeRegex = new Regex ( "^[A-Z]+([1-9][0-9]*)?:[A-Z]+([1-9][0-9]*)?|[1-9][0-9]*:[1-9][0-9]*$" , RegexOptions . Compiled ) ;
15
- private readonly static Regex interpretedStuffRegex = new Regex ( @"\[ (?<var>FR|LR|FC|LC)\] " , RegexOptions . Compiled | RegexOptions . IgnoreCase ) ;
15
+ private readonly static Regex evaluatedExpressionRegex = new Regex ( @"\{ (?<expression>[^\}])\} " , RegexOptions . Compiled | RegexOptions . IgnoreCase ) ;
16
16
17
17
public bool IsSelected { get ; set ; } = true ;
18
18
public string Name { get ; set ; } = string . Empty ;
@@ -58,22 +58,52 @@ public IEnumerable<IXLCell> GetCells(IXLWorksheet sheet)
58
58
59
59
private string InterpretStuffInFilter ( string filter , IXLWorksheet sheet )
60
60
{
61
- return interpretedStuffRegex . Replace ( filter , match =>
61
+ ExpressionEvaluator evaluator = new ExpressionEvaluator ( new Dictionary < string , object > ( )
62
62
{
63
- switch ( match . Groups [ "var" ] . Value )
63
+ { "FR" , sheet . FirstRowUsed ( ) . RangeAddress . FirstAddress . RowNumber } ,
64
+ { "LR" , sheet . LastRowUsed ( ) . RangeAddress . FirstAddress . RowNumber } ,
65
+ { "FC" , sheet . FirstColumnUsed ( ) . RangeAddress . FirstAddress . ColumnLetter } ,
66
+ { "LC" , sheet . LastColumnUsed ( ) . RangeAddress . FirstAddress . ColumnLetter } ,
67
+ { "FCN" , sheet . FirstColumnUsed ( ) . RangeAddress . FirstAddress . ColumnNumber } ,
68
+ { "LCN" , sheet . LastColumnUsed ( ) . RangeAddress . FirstAddress . ColumnNumber } ,
69
+ { "sheet" , sheet } ,
70
+ } ) ;
71
+
72
+ evaluator . EvaluateFunction += Evaluator_EvaluateFunction ;
73
+
74
+ string result = evaluatedExpressionRegex . Replace ( filter , match => evaluator . Evaluate ( match . Groups [ "expression" ] . Value ) . ToString ( ) ) ;
75
+
76
+ evaluator . EvaluateFunction -= Evaluator_EvaluateFunction ;
77
+
78
+ return result ;
79
+ }
80
+
81
+ private void Evaluator_EvaluateFunction ( object sender , FunctionEvaluationEventArg e )
82
+ {
83
+ IXLWorksheet sheet = e . Evaluator . Variables [ "sheet" ] as IXLWorksheet ;
84
+
85
+ if ( e . Name . Equals ( "ToNumber" ) )
86
+ {
87
+ if ( e . This != null )
64
88
{
65
- case "FR" :
66
- return sheet . FirstRowUsed ( ) . RangeAddress . FirstAddress . RowNumber . ToString ( ) ;
67
- case "LR" :
68
- return sheet . LastRowUsed ( ) . RangeAddress . FirstAddress . RowNumber . ToString ( ) ;
69
- case "FC" :
70
- return sheet . FirstColumnUsed ( ) . RangeAddress . FirstAddress . ColumnLetter ;
71
- case "LC" :
72
- return sheet . LastColumnUsed ( ) . RangeAddress . FirstAddress . ColumnLetter ;
73
- default :
74
- return "" ;
89
+ e . Value = sheet . Column ( ( string ) e . This ) . ColumnNumber ( ) ;
75
90
}
76
- } ) ;
91
+ else
92
+ {
93
+ e . Value = sheet . Column ( e . EvaluateArg < string > ( 0 ) ) . ColumnNumber ( ) ;
94
+ }
95
+ }
96
+ if ( e . Name . Equals ( "ToLetter" ) )
97
+ {
98
+ if ( e . This != null )
99
+ {
100
+ e . Value = sheet . Column ( ( int ) e . This ) . ColumnLetter ( ) ;
101
+ }
102
+ else
103
+ {
104
+ e . Value = sheet . Column ( e . EvaluateArg < int > ( 0 ) ) . ColumnLetter ( ) ;
105
+ }
106
+ }
77
107
}
78
108
}
79
109
}
0 commit comments