Skip to content

Commit 8dcfdba

Browse files
authored
ensured files with many defined names open faster in excel (#1242)
1 parent 0c19de3 commit 8dcfdba

File tree

2 files changed

+42
-15
lines changed

2 files changed

+42
-15
lines changed

src/EPPlus/ExcelWorkbook.cs

+31-14
Original file line numberDiff line numberDiff line change
@@ -1392,6 +1392,7 @@ private void SaveSharedStringHandler(ZipOutputStream stream, CompressionLevel co
13921392
}
13931393
private void UpdateDefinedNamesXml()
13941394
{
1395+
List<ExcelNamedRange> nameList = new List<ExcelNamedRange>();
13951396
try
13961397
{
13971398
XmlNode top = WorkbookXml.SelectSingleNode("//d:definedNames", NameSpaceManager);
@@ -1413,13 +1414,7 @@ private void UpdateDefinedNamesXml()
14131414
}
14141415
foreach (ExcelNamedRange name in _names)
14151416
{
1416-
1417-
XmlElement elem = WorkbookXml.CreateElement("definedName", ExcelPackage.schemaMain);
1418-
top.AppendChild(elem);
1419-
elem.SetAttribute("name", name.Name);
1420-
if (name.IsNameHidden) elem.SetAttribute("hidden", "1");
1421-
if (!string.IsNullOrEmpty(name.NameComment)) elem.SetAttribute("comment", name.NameComment);
1422-
SetNameElement(name, elem);
1417+
nameList.Add(name);
14231418
}
14241419
}
14251420
foreach (ExcelWorksheet ws in _worksheets)
@@ -1428,16 +1423,38 @@ private void UpdateDefinedNamesXml()
14281423
{
14291424
foreach (ExcelNamedRange name in ws.Names)
14301425
{
1431-
XmlElement elem = WorkbookXml.CreateElement("definedName", ExcelPackage.schemaMain);
1432-
top.AppendChild(elem);
1433-
elem.SetAttribute("name", name.Name);
1434-
elem.SetAttribute("localSheetId", name.LocalSheetId.ToString());
1435-
if (name.IsNameHidden) elem.SetAttribute("hidden", "1");
1436-
if (!string.IsNullOrEmpty(name.NameComment)) elem.SetAttribute("comment", name.NameComment);
1437-
SetNameElement(name, elem);
1426+
nameList.Add(name);
14381427
}
14391428
}
14401429
}
1430+
1431+
nameList.Sort(delegate (ExcelNamedRange x, ExcelNamedRange y)
1432+
{
1433+
var result = x.Name.CompareTo(y.Name);
1434+
1435+
if (result == 0)
1436+
{
1437+
var nameX = x.LocalSheetId <= -1 ? "" : x.LocalSheet.Name;
1438+
var nameY = y.LocalSheetId <= -1 ? "" : y.LocalSheet.Name;
1439+
1440+
result = nameX.CompareTo(nameY);
1441+
}
1442+
return result;
1443+
});
1444+
1445+
foreach (var name in nameList)
1446+
{
1447+
XmlElement elem = WorkbookXml.CreateElement("definedName", ExcelPackage.schemaMain);
1448+
top.AppendChild(elem);
1449+
elem.SetAttribute("name", name.Name);
1450+
if (name.LocalSheetId != -1)
1451+
{
1452+
elem.SetAttribute("localSheetId", name.LocalSheetId.ToString());
1453+
}
1454+
if (name.IsNameHidden) elem.SetAttribute("hidden", "1");
1455+
if (!string.IsNullOrEmpty(name.NameComment)) elem.SetAttribute("comment", name.NameComment);
1456+
SetNameElement(name, elem);
1457+
}
14411458
}
14421459
catch (Exception ex)
14431460
{

src/EPPlusTest/Issues.cs

+11-1
Original file line numberDiff line numberDiff line change
@@ -5643,5 +5643,15 @@ public void s580()
56435643
}
56445644
}
56455645

5646-
}
5646+
[TestMethod]
5647+
public void I1238()
5648+
{
5649+
using (var p = OpenTemplatePackage("I1238SlowWorkbook.xlsx"))
5650+
{
5651+
var ws = p.Workbook.Worksheets[0];
5652+
ws.Cells["A1"].Value = 1;
5653+
SaveAndCleanup(p);
5654+
}
5655+
}
5656+
}
56475657
}

0 commit comments

Comments
 (0)