Skip to content

Commit b2fe9cd

Browse files
authored
perf: Template save performance (mini-software#425)
1 parent d0ad435 commit b2fe9cd

1 file changed

Lines changed: 27 additions & 13 deletions

File tree

src/MiniExcel/OpenXml/ExcelOpenXmlTemplate.Impl.cs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
135135
sheetData.InnerText = "{{{{{{split}}}}}}"; //TODO: bad code smell
136136
var prefix = string.IsNullOrEmpty(sheetData.Prefix) ? "" : $"{sheetData.Prefix}:";
137137
var endPrefix = string.IsNullOrEmpty(sheetData.Prefix) ? "" : $":{sheetData.Prefix}"; //![image](https://user-images.githubusercontent.com/12729184/115000066-fd02b300-9ed4-11eb-8e65-bf0014015134.png)
138-
var contents = doc.InnerXml.Split(new string[] { $"<{prefix}sheetData>{{{{{{{{{{{{split}}}}}}}}}}}}</{prefix}sheetData>" }, StringSplitOptions.None); ;
138+
var contents = doc.InnerXml.Split(new string[] { $"<{prefix}sheetData>{{{{{{{{{{{{split}}}}}}}}}}}}</{prefix}sheetData>" }, StringSplitOptions.None);
139139
using (var writer = new StreamWriter(stream, Encoding.UTF8))
140140
{
141141
writer.Write(contents[0]);
@@ -164,7 +164,9 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
164164

165165
var newRow = row.Clone() as XmlElement;
166166
newRow.SetAttribute("r", newRowIndex.ToString());
167-
newRow.InnerXml = row.InnerXml.Replace($"{{{{$rowindex}}}}", newRowIndex.ToString());
167+
StringBuilder rowXml = new StringBuilder(newRow.InnerXml);
168+
// newRow.InnerXml = row.InnerXml.Replace($"{{{{$rowindex}}}}", newRowIndex.ToString());
169+
rowXml.Replace($"{{{{$rowindex}}}}", newRowIndex.ToString());
168170

169171
if (rowInfo.IsDictionary)
170172
{
@@ -174,14 +176,16 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
174176
var key = $"{{{{{rowInfo.IEnumerablePropName}.{propInfo.Key}}}}}";
175177
if (item == null) //![image](https://user-images.githubusercontent.com/12729184/114728510-bc3e5900-9d71-11eb-9721-8a414dca21a0.png)
176178
{
177-
newRow.InnerXml = newRow.InnerXml.Replace(key, "");
179+
// newRow.InnerXml = newRow.InnerXml.Replace(key, "");
180+
rowXml.Replace(key, "");
178181
continue;
179182
}
180183

181184
var cellValue = dic[propInfo.Key];
182185
if (cellValue == null)
183186
{
184-
newRow.InnerXml = newRow.InnerXml.Replace(key, "");
187+
// newRow.InnerXml = newRow.InnerXml.Replace(key, "");
188+
rowXml.Replace(key, "");
185189
continue;
186190
}
187191

@@ -198,7 +202,8 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
198202
}
199203

200204
//TODO: ![image](https://user-images.githubusercontent.com/12729184/114848248-17735880-9e11-11eb-8258-63266bda0a1a.png)
201-
newRow.InnerXml = newRow.InnerXml.Replace(key, cellValueStr);
205+
//newRow.InnerXml = newRow.InnerXml.Replace(key, cellValueStr);
206+
rowXml.Replace(key, cellValueStr);
202207
}
203208
}
204209
else if (rowInfo.IsDataTable)
@@ -209,14 +214,16 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
209214
var key = $"{{{{{rowInfo.IEnumerablePropName}.{propInfo.Key}}}}}";
210215
if (item == null) //![image](https://user-images.githubusercontent.com/12729184/114728510-bc3e5900-9d71-11eb-9721-8a414dca21a0.png)
211216
{
212-
newRow.InnerXml = newRow.InnerXml.Replace(key, "");
217+
// newRow.InnerXml = newRow.InnerXml.Replace(key, "");
218+
rowXml.Replace(key, "");
213219
continue;
214220
}
215221

216222
var cellValue = datarow[propInfo.Key];
217223
if (cellValue == null)
218224
{
219-
newRow.InnerXml = newRow.InnerXml.Replace(key, "");
225+
// newRow.InnerXml = newRow.InnerXml.Replace(key, "");
226+
rowXml.Replace(key, "");
220227
continue;
221228
}
222229

@@ -233,7 +240,8 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
233240
}
234241

235242
//TODO: ![image](https://user-images.githubusercontent.com/12729184/114848248-17735880-9e11-11eb-8258-63266bda0a1a.png)
236-
newRow.InnerXml = newRow.InnerXml.Replace(key, cellValueStr);
243+
//newRow.InnerXml = newRow.InnerXml.Replace(key, cellValueStr);
244+
rowXml.Replace(key, cellValueStr);
237245
}
238246
}
239247
else
@@ -245,14 +253,16 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
245253
var key = $"{{{{{rowInfo.IEnumerablePropName}.{prop.Name}}}}}";
246254
if (item == null) //![image](https://user-images.githubusercontent.com/12729184/114728510-bc3e5900-9d71-11eb-9721-8a414dca21a0.png)
247255
{
248-
newRow.InnerXml = newRow.InnerXml.Replace(key, "");
256+
//newRow.InnerXml = newRow.InnerXml.Replace(key, "");
257+
rowXml.Replace(key, "");
249258
continue;
250259
}
251260

252261
var cellValue = prop.GetValue(item);
253262
if (cellValue == null)
254263
{
255-
newRow.InnerXml = newRow.InnerXml.Replace(key, "");
264+
//newRow.InnerXml = newRow.InnerXml.Replace(key, "");
265+
rowXml.Replace(key, "");
256266
continue;
257267
}
258268

@@ -274,10 +284,14 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
274284
}
275285

276286
//TODO: ![image](https://user-images.githubusercontent.com/12729184/114848248-17735880-9e11-11eb-8258-63266bda0a1a.png)
277-
newRow.InnerXml = newRow.InnerXml.Replace(key, cellValueStr);
287+
// newRow.InnerXml = newRow.InnerXml.Replace(key, cellValueStr);
288+
rowXml.Replace(key, cellValueStr);
289+
StringBuilder stringBuilder = new StringBuilder();
278290
}
279291
}
280292

293+
newRow.InnerXml = rowXml.ToString();
294+
281295
// note: only first time need add diff ![image](https://user-images.githubusercontent.com/12729184/114494728-6bceda80-9c4f-11eb-9685-8b5ed054eabe.png)
282296
if (!first)
283297
//rowIndexDiff++;
@@ -326,7 +340,7 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
326340
}
327341
}
328342

329-
_newRow.InnerXml = _newRow.InnerXml.Replace($"{{{{$rowindex}}}}", mergeBaseRowIndex.ToString());
343+
_newRow.InnerXml = new StringBuilder(_newRow.InnerXml).Replace($"{{{{$rowindex}}}}", mergeBaseRowIndex.ToString()).ToString();
330344
writer.Write(CleanXml(_newRow.OuterXml, endPrefix));
331345
}
332346
}
@@ -335,7 +349,7 @@ private void WriteSheetXml(Stream stream, XmlDocument doc, XmlNode sheetData)
335349
else
336350
{
337351
row.SetAttribute("r", newRowIndex.ToString());
338-
row.InnerXml = row.InnerXml.Replace($"{{{{$rowindex}}}}", newRowIndex.ToString());
352+
row.InnerXml = new StringBuilder(row.InnerXml).Replace($"{{{{$rowindex}}}}", newRowIndex.ToString()).ToString();
339353
writer.Write(CleanXml(row.OuterXml, endPrefix));
340354

341355
//mergecells

0 commit comments

Comments
 (0)