|
1 | 1 | using System.Collections;
|
2 | 2 | using System.Collections.Generic;
|
3 |
| -using System.Diagnostics; |
4 | 3 | using System.Linq;
|
5 | 4 | using System.Linq.Dynamic.Core.Exceptions;
|
6 | 5 | using ClosedXML.Excel;
|
@@ -30,43 +29,45 @@ public class RangeTemplate
|
30 | 29 | private IXLConditionalFormat[] _condFormats;
|
31 | 30 | private IXLConditionalFormat[] _totalsCondFormats;
|
32 | 31 | private bool _isSubrange;
|
| 32 | + private IDictionary<string, object> _globalVariables; |
33 | 33 |
|
34 | 34 | public string Source { get; private set; }
|
35 | 35 | public string Name { get; private set; }
|
36 | 36 |
|
37 |
| - internal RangeTemplate(IXLNamedRange range, TempSheetBuffer buff, TemplateErrors errors) |
| 37 | + internal RangeTemplate(IXLNamedRange range, TempSheetBuffer buff, TemplateErrors errors, IDictionary<string, object> globalVariables) |
38 | 38 | {
|
39 | 39 | _rowRange = range.Ranges.First();
|
40 | 40 | _cells = new TemplateCells(this);
|
41 | 41 | _tagsEvaluator = new TagsEvaluator();
|
42 | 42 | var wb = _rowRange.Worksheet.Workbook;
|
43 | 43 | _buff = buff;
|
44 | 44 | _errors = errors;
|
| 45 | + _globalVariables = globalVariables; |
45 | 46 | _tags = new TagsList(_errors);
|
46 | 47 | _rangeTags = new TagsList(_errors);
|
47 | 48 | Name = range.Name;
|
48 | 49 | Source = range.Name;
|
49 | 50 | wb.NamedRanges.Add(range.Name + "_tpl", range.Ranges);
|
50 | 51 | }
|
51 | 52 |
|
52 |
| - internal RangeTemplate(IXLNamedRange range, TempSheetBuffer buff, int rowCnt, int colCnt, TemplateErrors errors) : this(range, buff, errors) |
| 53 | + internal RangeTemplate(IXLNamedRange range, TempSheetBuffer buff, int rowCnt, int colCnt, TemplateErrors errors, IDictionary<string, object> globalVariables) : this(range, buff, errors, globalVariables) |
53 | 54 | {
|
54 | 55 | _rowCnt = rowCnt;
|
55 | 56 | _colCnt = colCnt;
|
56 | 57 | }
|
57 | 58 |
|
58 | 59 |
|
59 |
| - public static RangeTemplate Parse(IXLNamedRange range, TemplateErrors errors) |
| 60 | + public static RangeTemplate Parse(IXLNamedRange range, TemplateErrors errors, IDictionary<string, object> globalVariables) |
60 | 61 | {
|
61 | 62 | var wb = range.Ranges.First().Worksheet.Workbook;
|
62 |
| - return Parse(range, new TempSheetBuffer(wb), errors); |
| 63 | + return Parse(range, new TempSheetBuffer(wb), errors, globalVariables); |
63 | 64 | }
|
64 | 65 |
|
65 |
| - private static RangeTemplate Parse(IXLNamedRange range, TempSheetBuffer buff, TemplateErrors errors, RangeTemplate parent = null) |
| 66 | + private static RangeTemplate Parse(IXLNamedRange range, TempSheetBuffer buff, TemplateErrors errors, IDictionary<string, object> globalVariables) |
66 | 67 | {
|
67 | 68 | var prng = range.Ranges.First();
|
68 | 69 | var result = new RangeTemplate(range, buff,
|
69 |
| - prng.RowCount(), prng.ColumnCount(), errors); |
| 70 | + prng.RowCount(), prng.ColumnCount(), errors, globalVariables); |
70 | 71 |
|
71 | 72 | var innerRanges = GetInnerRanges(prng).ToArray();
|
72 | 73 |
|
@@ -109,9 +110,10 @@ private static RangeTemplate Parse(IXLNamedRange range, TempSheetBuffer buff, Te
|
109 | 110 |
|
110 | 111 | result._subranges = innerRanges.Select(rng =>
|
111 | 112 | {
|
112 |
| - var tpl = Parse(rng, buff, errors, result); |
| 113 | + var tpl = Parse(rng, buff, errors, globalVariables); |
113 | 114 | tpl._buff = result._buff;
|
114 | 115 | tpl._isSubrange = true;
|
| 116 | + tpl._globalVariables = globalVariables; |
115 | 117 | return tpl;
|
116 | 118 | }).ToArray();
|
117 | 119 |
|
@@ -143,6 +145,10 @@ public IReportBuffer Generate(object[] items)
|
143 | 145 | {
|
144 | 146 | var evaluator = new FormulaEvaluator();
|
145 | 147 | evaluator.AddVariable("items", items);
|
| 148 | + foreach (var v in _globalVariables) |
| 149 | + { |
| 150 | + evaluator.AddVariable("@"+v.Key, v.Value); |
| 151 | + } |
146 | 152 | _rangeTags.Reset();
|
147 | 153 |
|
148 | 154 | if (IsHorizontal)
|
@@ -321,7 +327,6 @@ private void RenderSubrange(object item, FormulaEvaluator evaluator, TemplateCel
|
321 | 327 |
|
322 | 328 | private void HorizontalTable(object[] items, FormulaEvaluator evaluator)
|
323 | 329 | {
|
324 |
| - var rangeStart = _buff.NextAddress; |
325 | 330 | var tags = _tags.CopyTo(_rowRange);
|
326 | 331 | for (int i = 0; i < items.Length; i++)
|
327 | 332 | {
|
|
0 commit comments