@@ -138,10 +138,12 @@ internal partial class ExcelOpenXmlTemplate
138
138
private static readonly Regex _cellRegex = CellRegex ( ) ;
139
139
[ GeneratedRegex ( @"\{\{(.*?)\}\}" ) ] private static partial Regex TemplateRegex ( ) ;
140
140
private static readonly Regex _templateRegex = TemplateRegex ( ) ;
141
-
141
+ [ GeneratedRegex ( @".*?\{\{.*?\}\}.*?" ) ] private static partial Regex NonTemplateRegex ( ) ;
142
+ private static readonly Regex _nonTemplateRegex = TemplateRegex ( ) ;
142
143
#else
143
144
private static readonly Regex _cellRegex = new Regex ( "([A-Z]+)([0-9]+)" , RegexOptions . Compiled ) ;
144
145
private static readonly Regex _templateRegex = new Regex ( @"\{\{(.*?)\}\}" , RegexOptions . Compiled ) ;
146
+ private static readonly Regex _nonTemplateRegex = new Regex ( @".*?\{\{.*?\}\}.*?" , RegexOptions . Compiled ) ;
145
147
#endif
146
148
147
149
private void GenerateSheetXmlImplByUpdateMode ( ZipArchiveEntry sheetZipEntry , Stream stream , Stream sheetStream , IDictionary < string , object > inputMaps , IDictionary < int , string > sharedStrings , bool mergeCells = false )
@@ -174,7 +176,6 @@ private void GenerateSheetXmlImplByCreateMode(ZipArchiveEntry templateSheetZipEn
174
176
}
175
177
176
178
//outputSheetStream.Dispose();
177
-
178
179
//sheetZipEntry.Delete(); // ZipArchiveEntry can't update directly, so need to delete then create logic
179
180
180
181
var worksheet = doc . SelectSingleNode ( "/x:worksheet" , _ns ) ;
@@ -445,7 +446,7 @@ private void WriteSheetXml(Stream outputFileStream, XmlDocument doc, XmlNode she
445
446
var iEnumerableIndex = 0 ;
446
447
enumrowstart = newRowIndex ;
447
448
448
- CellIEnumerableValuesGenerate ( endPrefix , writer , ref rowIndexDiff , rowXml , ref headerDiff , ref prevHeader , mergeRowCount , isHeaderRow , ref currentHeader , rowInfo , row , groupingRowDiff , ref newRowIndex , innerXml , outerXmlOpen , ref isFirst , ref iEnumerableIndex , row ) ;
449
+ GenerateCellValues ( endPrefix , writer , ref rowIndexDiff , rowXml , ref headerDiff , ref prevHeader , mergeRowCount , isHeaderRow , ref currentHeader , rowInfo , row , groupingRowDiff , ref newRowIndex , innerXml , outerXmlOpen , ref isFirst , ref iEnumerableIndex , row ) ;
449
450
enumrowend = newRowIndex - 1 ;
450
451
451
452
var conditionalFormats = conditionalFormatRanges . Where ( cfr => cfr . Ranges . Any ( r => r . ContainsRow ( originRowIndex ) ) ) ;
@@ -479,9 +480,9 @@ private void WriteSheetXml(Stream outputFileStream, XmlDocument doc, XmlNode she
479
480
. Append ( outerXmlOpen )
480
481
. AppendFormat ( @" r=""{0}"">" , newRowIndex )
481
482
. Append ( innerXml )
482
- . Replace ( $ "{{{{ $rowindex}} }}", newRowIndex . ToString ( ) )
483
- . Replace ( $ "{{{{ $enumrowstart}} }}", enumrowstart . ToString ( ) )
484
- . Replace ( $ "{{{{ $enumrowend}} }}", enumrowend . ToString ( ) )
483
+ . Replace ( "{{$rowindex}}" , newRowIndex . ToString ( ) )
484
+ . Replace ( "{{$enumrowstart}}" , enumrowstart . ToString ( ) )
485
+ . Replace ( "{{$enumrowend}}" , enumrowend . ToString ( ) )
485
486
. AppendFormat ( "</{0}>" , row . Name ) ;
486
487
487
488
ProcessFormulas ( rowXml , newRowIndex ) ;
@@ -525,13 +526,13 @@ private void WriteSheetXml(Stream outputFileStream, XmlDocument doc, XmlNode she
525
526
}
526
527
}
527
528
528
- private void CellIEnumerableValuesGenerate ( string endPrefix , StreamWriter writer , ref int rowIndexDiff ,
529
+ //todo: refactor in a way that needs less parameters
530
+ private void GenerateCellValues ( string endPrefix , StreamWriter writer , ref int rowIndexDiff ,
529
531
StringBuilder rowXml , ref int headerDiff , ref string prevHeader , int mergeRowCount , bool isHeaderRow ,
530
532
ref string currentHeader , XRowInfo rowInfo , XmlElement row , int groupingRowDiff , ref int newRowIndex ,
531
533
string innerXml , StringBuilder outerXmlOpen , ref bool isFirst , ref int iEnumerableIndex , XmlElement rowElement )
532
534
{
533
535
// Just need to remove space string one time https://github.com/mini-software/MiniExcel/issues/751
534
- var cleanRowXml = CleanXml ( rowXml , endPrefix ) ;
535
536
var cleanOuterXmlOpen = CleanXml ( outerXmlOpen , endPrefix ) ;
536
537
var cleanInnerXml = CleanXml ( innerXml , endPrefix ) ;
537
538
@@ -540,11 +541,10 @@ private void CellIEnumerableValuesGenerate(string endPrefix, StreamWriter writer
540
541
foreach ( XmlElement c in notFirstRowInnerXmlElement . SelectNodes ( "x:c" , _ns ) )
541
542
{
542
543
var v = c . SelectSingleNode ( "x:v" , _ns ) ;
543
- if ( v != null && ! Regex . IsMatch ( v . InnerText , @".*?\{\{.*?\}\}.*?" ) )
544
+ if ( v != null && ! _nonTemplateRegex . IsMatch ( v . InnerText ) )
544
545
v . InnerText = string . Empty ;
545
546
}
546
- var cleannotFirstRowInnerXmlElementInnerXml = CleanXml ( notFirstRowInnerXmlElement . InnerXml , endPrefix ) ;
547
-
547
+ var cleanNotFirstRowInnerXmlElement = CleanXml ( notFirstRowInnerXmlElement . InnerXml , endPrefix ) ;
548
548
549
549
foreach ( var item in rowInfo . CellIEnumerableValues )
550
550
{
@@ -553,7 +553,7 @@ private void CellIEnumerableValuesGenerate(string endPrefix, StreamWriter writer
553
553
. Append ( cleanOuterXmlOpen )
554
554
. AppendFormat ( @" r=""{0}"">" , newRowIndex )
555
555
. Append ( cleanInnerXml )
556
- . Replace ( $ "{{{{ $rowindex}} }}", newRowIndex . ToString ( ) )
556
+ . Replace ( "{{$rowindex}}" , newRowIndex . ToString ( ) )
557
557
. AppendFormat ( "</{0}>" , row . Name ) ;
558
558
559
559
var rowXmlString = rowXml . ToString ( ) ;
@@ -721,7 +721,7 @@ private void CellIEnumerableValuesGenerate(string endPrefix, StreamWriter writer
721
721
if ( isFirst )
722
722
{
723
723
// https://github.com/mini-software/MiniExcel/issues/771 Saving by template introduces unintended value replication in each row #771
724
- cleanInnerXml = cleannotFirstRowInnerXmlElementInnerXml ;
724
+ cleanInnerXml = cleanNotFirstRowInnerXmlElement ;
725
725
726
726
727
727
isFirst = false ;
@@ -777,7 +777,7 @@ private void CellIEnumerableValuesGenerate(string endPrefix, StreamWriter writer
777
777
}
778
778
}
779
779
780
- newRow . InnerXml = new StringBuilder ( newRow . InnerXml ) . Replace ( $ "{{{{ $rowindex}} }}", mergeBaseRowIndex . ToString ( ) ) . ToString ( ) ;
780
+ newRow . InnerXml = new StringBuilder ( newRow . InnerXml ) . Replace ( "{{$rowindex}}" , mergeBaseRowIndex . ToString ( ) ) . ToString ( ) ;
781
781
writer . Write ( CleanXml ( newRow . OuterXml , endPrefix ) ) ;
782
782
}
783
783
}
@@ -1007,6 +1007,7 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
1007
1007
//Type ienumerableGenricType = null;
1008
1008
//IDictionary<string, PropertyInfo> props = null;
1009
1009
//IEnumerable ienumerable = null;
1010
+
1010
1011
var xRowInfo = new XRowInfo
1011
1012
{
1012
1013
Row = row
@@ -1040,8 +1041,8 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
1040
1041
. Distinct ( )
1041
1042
. ToArray ( ) ;
1042
1043
1043
- var matchCnt = matches . Length ;
1044
- var isMultiMatch = matchCnt > 1 || ( matchCnt == 1 && v . InnerText != $ "{{{{{matches[0]}}}}}") ;
1044
+ var matchCount = matches . Length ;
1045
+ var isMultiMatch = matchCount > 1 || ( matchCount == 1 && v . InnerText != $ "{{{{{matches[0]}}}}}") ;
1045
1046
1046
1047
foreach ( var formatText in matches )
1047
1048
{
0 commit comments