@@ -34,9 +34,9 @@ public class RangeTemplate
34
34
public string Source { get ; private set ; }
35
35
public string Name { get ; }
36
36
37
- internal RangeTemplate ( IXLNamedRange range , TempSheetBuffer buff , TemplateErrors errors , IDictionary < string , object > globalVariables )
37
+ internal RangeTemplate ( string name , IXLRange range , TempSheetBuffer buff , TemplateErrors errors , IDictionary < string , object > globalVariables )
38
38
{
39
- _rowRange = range . Ranges . First ( ) ;
39
+ _rowRange = range ;
40
40
_cells = new TemplateCells ( this ) ;
41
41
_tagsEvaluator = new TagsEvaluator ( ) ;
42
42
var wb = _rowRange . Worksheet . Workbook ;
@@ -45,40 +45,48 @@ internal RangeTemplate(IXLNamedRange range, TempSheetBuffer buff, TemplateErrors
45
45
_globalVariables = globalVariables ;
46
46
_tags = new TagsList ( _errors ) ;
47
47
_rangeTags = new TagsList ( _errors ) ;
48
- Name = range . Name ;
49
- Source = range . Name ;
50
- wb . NamedRanges . Add ( range . Name + "_tpl" , range . Ranges ) ;
48
+ Name = name ;
49
+ Source = name ;
50
+ var rangeName = name + "_tpl" ;
51
+ if ( wb . NamedRanges . TryGetValue ( rangeName , out var namedRange ) )
52
+ {
53
+ namedRange . Add ( range ) ;
54
+ }
55
+ else
56
+ {
57
+ wb . NamedRanges . Add ( rangeName , range ) ;
58
+ }
59
+
51
60
_evaluator = new FormulaEvaluator ( ) ;
52
61
}
53
62
54
- internal RangeTemplate ( IXLNamedRange range , TempSheetBuffer buff , int rowCnt , int colCnt , TemplateErrors errors , IDictionary < string , object > globalVariables ) : this ( range , buff , errors , globalVariables )
63
+ internal RangeTemplate ( string name , IXLRange range , TempSheetBuffer buff , int rowCnt , int colCnt , TemplateErrors errors , IDictionary < string , object > globalVariables ) : this ( name , range , buff , errors , globalVariables )
55
64
{
56
65
_rowCnt = rowCnt ;
57
66
_colCnt = colCnt ;
58
67
}
59
68
60
69
61
- public static RangeTemplate Parse ( IXLNamedRange range , TemplateErrors errors , IDictionary < string , object > globalVariables )
70
+ public static RangeTemplate Parse ( string name , IXLRange range , TemplateErrors errors , IDictionary < string , object > globalVariables )
62
71
{
63
- var wb = range . Ranges . First ( ) . Worksheet . Workbook ;
64
- return Parse ( range , new TempSheetBuffer ( wb ) , errors , globalVariables ) ;
72
+ var wb = range . Worksheet . Workbook ;
73
+ return Parse ( name , range , new TempSheetBuffer ( wb ) , errors , globalVariables ) ;
65
74
}
66
75
67
- private static RangeTemplate Parse ( IXLNamedRange range , TempSheetBuffer buff , TemplateErrors errors , IDictionary < string , object > globalVariables )
76
+ private static RangeTemplate Parse ( string name , IXLRange range , TempSheetBuffer buff , TemplateErrors errors , IDictionary < string , object > globalVariables )
68
77
{
69
- var prng = range . Ranges . First ( ) ;
70
- var result = new RangeTemplate ( range , buff ,
71
- prng . RowCount ( ) , prng . ColumnCount ( ) , errors , globalVariables ) ;
78
+ var result = new RangeTemplate ( name , range , buff ,
79
+ range . RowCount ( ) , range . ColumnCount ( ) , errors , globalVariables ) ;
72
80
73
- var innerRanges = GetInnerRanges ( prng ) . ToArray ( ) ;
81
+ var innerRanges = GetInnerRanges ( range ) . ToArray ( ) ;
74
82
75
- var sheet = prng . Worksheet ;
83
+ var sheet = range . Worksheet ;
76
84
77
85
for ( int iRow = 1 ; iRow <= result . _rowCnt ; iRow ++ )
78
86
{
79
87
for ( int iColumn = 1 ; iColumn <= result . _colCnt ; iColumn ++ )
80
88
{
81
- var xlCell = prng . Cell ( iRow , iColumn ) ;
89
+ var xlCell = range . Cell ( iRow , iColumn ) ;
82
90
if ( innerRanges . Any ( x => x . Ranges . Cells ( ) . Contains ( xlCell ) ) )
83
91
xlCell = null ;
84
92
result . _cells . Add ( iRow , iColumn , xlCell ) ;
@@ -87,29 +95,30 @@ private static RangeTemplate Parse(IXLNamedRange range, TempSheetBuffer buff, Te
87
95
result . _cells . AddNewRow ( ) ;
88
96
}
89
97
90
- result . _mergedRanges = sheet . MergedRanges . Where ( x => prng . Contains ( x ) && ! innerRanges . Any ( nr=> nr . Ranges . Any ( r=> r . Contains ( x ) ) ) ) . ToArray ( ) ;
98
+ result . _mergedRanges = sheet . MergedRanges . Where ( x => range . Contains ( x ) && ! innerRanges . Any ( nr=> nr . Ranges . Any ( r=> r . Contains ( x ) ) ) ) . ToArray ( ) ;
91
99
sheet . MergedRanges . RemoveAll ( result . _mergedRanges . Contains ) ;
92
100
93
- result . ParseTags ( prng ) ;
101
+ result . ParseTags ( range ) ;
94
102
95
103
if ( result . _rowCnt > 1 && ! result . IsHorizontal )
96
104
{
97
105
// Exclude special row
98
106
result . _rowCnt -- ;
99
107
100
- result . _rowRange = prng . Offset ( 0 , 0 , result . _rowCnt , result . _colCnt ) ;
101
- result . _optionsRow = prng . LastRow ( ) ;
108
+ result . _rowRange = range . Offset ( 0 , 0 , result . _rowCnt , result . _colCnt ) ;
109
+ result . _optionsRow = range . LastRow ( ) ;
102
110
result . _optionsRowIsEmpty = ! result . _optionsRow . CellsUsed ( XLCellsUsedOptions . AllContents | XLCellsUsedOptions . MergedRanges ) . Any ( ) ;
103
111
}
104
112
105
- result . _subranges = innerRanges . Select ( rng =>
106
- {
107
- var tpl = Parse ( rng , buff , errors , globalVariables ) ;
108
- tpl . _buff = result . _buff ;
109
- tpl . _isSubrange = true ;
110
- tpl . _globalVariables = globalVariables ;
111
- return tpl ;
112
- } ) . ToArray ( ) ;
113
+ result . _subranges = innerRanges . SelectMany ( nrng => nrng . Ranges ,
114
+ ( nr , rng ) =>
115
+ {
116
+ var tpl = Parse ( nr . Name , rng , buff , errors , globalVariables ) ;
117
+ tpl . _buff = result . _buff ;
118
+ tpl . _isSubrange = true ;
119
+ tpl . _globalVariables = globalVariables ;
120
+ return tpl ;
121
+ } ) . ToArray ( ) ;
113
122
114
123
if ( result . _rangeOption != null )
115
124
{
0 commit comments