Skip to content

Commit f572df3

Browse files
Solves issue 459 and removes redundant api methods
1 parent ecfadda commit f572df3

File tree

5 files changed

+53
-34
lines changed

5 files changed

+53
-34
lines changed

samples/xlsx/TestIssue459.xlsx

10.2 KB
Binary file not shown.

src/MiniExcel/MiniExcel.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -298,18 +298,7 @@ public static IList<ExcelRange> GetSheetDimensions(this Stream stream)
298298
{
299299
return new ExcelOpenXmlSheetReader(stream, null).GetDimensions();
300300
}
301-
302-
public static IList<ExcelRange> GetSheetsDimensions(string path)
303-
{
304-
using (var stream = FileHelper.OpenSharedRead(path))
305-
return GetSheetsDimensions(stream);
306-
}
307-
308-
public static IList<ExcelRange> GetSheetsDimensions(this Stream stream)
309-
{
310-
return new ExcelOpenXmlSheetReader(stream, null).GetDimensions();
311-
}
312-
301+
313302
public static void ConvertCsvToXlsx(string csv, string xlsx)
314303
{
315304
using (var csvStream = FileHelper.OpenSharedRead(csv))

src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.Impl.cs

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -991,30 +991,38 @@ private static void ReplaceSharedStringsToStr(IDictionary<int, string> sharedStr
991991

992992
private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps, XmlDocument doc, XmlNodeList rows, bool changeRowIndex = true)
993993
{
994-
// note : dimension need to put on the top (https://user-images.githubusercontent.com/12729184/114507911-5dd88400-9c66-11eb-94c6-82ed7bdb5aab.png)
994+
string[] refs;
995+
if (doc.SelectSingleNode("/x:worksheet/x:dimension", _ns) is XmlElement dimension)
996+
{
997+
refs = dimension.GetAttribute("ref").Split(':');
998+
}
999+
else
1000+
{
1001+
var firstRow = rows[0].SelectNodes("x:c", _ns);
1002+
var lastRow = rows[rows.Count - 1].SelectNodes("x:c", _ns);
1003+
1004+
var dimStart = ((XmlElement)firstRow?[0])?.GetAttribute("r");
1005+
var dimEnd = ((XmlElement)lastRow?[lastRow.Count - 1])?.GetAttribute("r");
1006+
1007+
refs = new[] { dimStart, dimEnd };
9951008

996-
var dimension = doc.SelectSingleNode("/x:worksheet/x:dimension", _ns) as XmlElement;
997-
if (dimension == null)
998-
throw new NotImplementedException("Excel Dimension Xml is null, please file an issue for this problem: https://github.com/mini-software/MiniExcel/issues");
1009+
dimension = (XmlElement)doc.CreateNode(XmlNodeType.Element, "dimension", null);
1010+
var worksheet = doc.SelectSingleNode("/x:worksheet", _ns);
1011+
worksheet?.InsertBefore(dimension, worksheet.FirstChild);
1012+
}
9991013

10001014
var maxRowIndexDiff = 0;
10011015
foreach (XmlElement row in rows)
10021016
{
10031017
// ==== get ienumerable infomation & maxrowindexdiff ====
1004-
//Type ienumerableGenricType = null;
1005-
//IDictionary<string, PropertyInfo> props = null;
1006-
//IEnumerable ienumerable = null;
10071018

1008-
var xRowInfo = new XRowInfo
1009-
{
1010-
Row = row
1011-
};
1012-
1019+
var xRowInfo = new XRowInfo { Row = row };
10131020
_xRowInfos.Add(xRowInfo);
1021+
10141022
foreach (XmlElement c in row.SelectNodes("x:c", _ns))
10151023
{
10161024
var r = c.GetAttribute("r");
1017-
1025+
10181026
// ==== mergecells ====
10191027
if (_xMergeCellInfos.TryGetValue(r, out var merCell))
10201028
{
@@ -1122,7 +1130,7 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
11221130
}
11231131

11241132
// ==== get dimension max rowindex ====
1125-
if (!first) //avoid duplicate add first one, this row not add status ![image](https://user-images.githubusercontent.com/12729184/114851829-d2512580-9e14-11eb-8e7d-520c89a7ebee.png)
1133+
if (!first) //avoid duplicate add first one, this row not add status (https://user-images.githubusercontent.com/12729184/114851829-d2512580-9e14-11eb-8e7d-520c89a7ebee.png)
11261134
maxRowIndexDiff += xRowInfo.IEnumerableMercell?.Height ?? 1;
11271135
first = false;
11281136
}
@@ -1183,7 +1191,7 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
11831191
foreach (var element in xRowInfo.CellIEnumerableValues)
11841192
{
11851193
// ==== get demension max rowindex ====
1186-
if (!first) //avoid duplicate add first one, this row not add status ![image](https://user-images.githubusercontent.com/12729184/114851829-d2512580-9e14-11eb-8e7d-520c89a7ebee.png)
1194+
if (!first) //avoid duplicate add first one, this row not add status (https://user-images.githubusercontent.com/12729184/114851829-d2512580-9e14-11eb-8e7d-520c89a7ebee.png)
11871195
maxRowIndexDiff++;
11881196
first = false;
11891197
}
@@ -1249,20 +1257,17 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
12491257
}
12501258
}
12511259

1252-
// e.g <dimension ref=\"A1:B6\" /> only need to update B6 to BMaxRowIndex
1253-
var refs = dimension.GetAttribute("ref").Split(':');
1260+
// e.g <dimension ref=\"A1:B6\" /> we only need to update B6 to BMaxRowIndex
12541261
if (refs.Length == 2)
12551262
{
12561263
var letter = StringHelper.GetLetters(refs[1]);
12571264
var digit = StringHelper.GetNumber(refs[1]);
1258-
12591265
dimension.SetAttribute("ref", $"{refs[0]}:{letter}{digit + maxRowIndexDiff}");
12601266
}
12611267
else
12621268
{
12631269
var letter = StringHelper.GetLetters(refs[0]);
12641270
var digit = StringHelper.GetNumber(refs[0]);
1265-
12661271
dimension.SetAttribute("ref", $"A1:{letter}{digit + maxRowIndexDiff}");
12671272
}
12681273
}

tests/MiniExcelTests/MiniExcelIssueTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3615,6 +3615,31 @@ public void Issue422()
36153615
Assert.Equal(1, enumerableWithCount.GetEnumeratorCount);
36163616
}
36173617

3618+
[Fact]
3619+
public void Issue459()
3620+
{
3621+
var template = PathHelper.GetFile("xlsx/TestIssue459.xlsx");
3622+
using var ms = new MemoryStream();
3623+
var values = new
3624+
{
3625+
title = "FooCompany",
3626+
managers = new[]
3627+
{
3628+
new { name = "Jack", department = "HR" },
3629+
new { name = "Loan", department = "IT" }
3630+
},
3631+
employees = new[]
3632+
{
3633+
new { name = "Wade", department = "HR" },
3634+
new { name = "Felix", department = "HR" },
3635+
new { name = "Eric", department = "IT" },
3636+
new { name = "Keaton", department = "IT" }
3637+
}
3638+
};
3639+
3640+
ms.SaveAsByTemplate(template, values);
3641+
}
3642+
36183643
private class Issue585VO1
36193644
{
36203645
public string Col1 { get; set; }

tests/MiniExcelTests/MiniExcelOpenXmlTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,7 +1549,7 @@ public void DateOnlySupportTest()
15491549
public void SheetDimensionsTest()
15501550
{
15511551
var path1 = PathHelper.GetFile("xlsx/TestTypeMapping.xlsx");
1552-
var dim1 = MiniExcel.GetSheetsDimensions(path1);
1552+
var dim1 = MiniExcel.GetSheetDimensions(path1);
15531553
Assert.Equal("A1", dim1[0].StartCell);
15541554
Assert.Equal("H101", dim1[0].EndCell);
15551555
Assert.Equal(101, dim1[0].Rows.Count);
@@ -1560,7 +1560,7 @@ public void SheetDimensionsTest()
15601560
Assert.Equal(8, dim1[0].Columns.EndIndex);
15611561

15621562
var path2 = PathHelper.GetFile("xlsx/TestNoDimension.xlsx");
1563-
var dim2 = MiniExcel.GetSheetsDimensions(path2);
1563+
var dim2 = MiniExcel.GetSheetDimensions(path2);
15641564
Assert.Equal(101, dim2[0].Rows.Count);
15651565
Assert.Equal(7, dim2[0].Columns.Count);
15661566
Assert.Equal(1, dim2[0].Rows.StartIndex);
@@ -1573,7 +1573,7 @@ public void SheetDimensionsTest()
15731573
public void SheetDimensionsTest_MultiSheet()
15741574
{
15751575
var path = PathHelper.GetFile("xlsx/TestMultiSheet.xlsx");
1576-
var dim = MiniExcel.GetSheetsDimensions(path);
1576+
var dim = MiniExcel.GetSheetDimensions(path);
15771577

15781578
Assert.Equal("A1", dim[0].StartCell);
15791579
Assert.Equal("D12", dim[0].EndCell);

0 commit comments

Comments
 (0)