Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added samples/xlsx/TestIssue459.xlsx
Binary file not shown.
13 changes: 1 addition & 12 deletions src/MiniExcel/MiniExcel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -298,18 +298,7 @@ public static IList<ExcelRange> GetSheetDimensions(this Stream stream)
{
return new ExcelOpenXmlSheetReader(stream, null).GetDimensions();
}

public static IList<ExcelRange> GetSheetsDimensions(string path)
{
using (var stream = FileHelper.OpenSharedRead(path))
return GetSheetsDimensions(stream);
}

public static IList<ExcelRange> GetSheetsDimensions(this Stream stream)
{
return new ExcelOpenXmlSheetReader(stream, null).GetDimensions();
}


public static void ConvertCsvToXlsx(string csv, string xlsx)
{
using (var csvStream = FileHelper.OpenSharedRead(csv))
Expand Down
43 changes: 24 additions & 19 deletions src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.Impl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -991,30 +991,38 @@ private static void ReplaceSharedStringsToStr(IDictionary<int, string> sharedStr

private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps, XmlDocument doc, XmlNodeList rows, bool changeRowIndex = true)
{
// note : dimension need to put on the top (https://user-images.githubusercontent.com/12729184/114507911-5dd88400-9c66-11eb-94c6-82ed7bdb5aab.png)
string[] refs;
if (doc.SelectSingleNode("/x:worksheet/x:dimension", _ns) is XmlElement dimension)
{
refs = dimension.GetAttribute("ref").Split(':');
}
else
{
var firstRow = rows[0].SelectNodes("x:c", _ns);
var lastRow = rows[rows.Count - 1].SelectNodes("x:c", _ns);

var dimStart = ((XmlElement)firstRow?[0])?.GetAttribute("r");
var dimEnd = ((XmlElement)lastRow?[lastRow.Count - 1])?.GetAttribute("r");

refs = new[] { dimStart, dimEnd };

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

var maxRowIndexDiff = 0;
foreach (XmlElement row in rows)
{
// ==== get ienumerable infomation & maxrowindexdiff ====
//Type ienumerableGenricType = null;
//IDictionary<string, PropertyInfo> props = null;
//IEnumerable ienumerable = null;

var xRowInfo = new XRowInfo
{
Row = row
};

var xRowInfo = new XRowInfo { Row = row };
_xRowInfos.Add(xRowInfo);

foreach (XmlElement c in row.SelectNodes("x:c", _ns))
{
var r = c.GetAttribute("r");

// ==== mergecells ====
if (_xMergeCellInfos.TryGetValue(r, out var merCell))
{
Expand Down Expand Up @@ -1122,7 +1130,7 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
}

// ==== get dimension max rowindex ====
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)
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)
maxRowIndexDiff += xRowInfo.IEnumerableMercell?.Height ?? 1;
first = false;
}
Expand Down Expand Up @@ -1183,7 +1191,7 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
foreach (var element in xRowInfo.CellIEnumerableValues)
{
// ==== get demension max rowindex ====
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)
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)
maxRowIndexDiff++;
first = false;
}
Expand Down Expand Up @@ -1249,20 +1257,17 @@ private void UpdateDimensionAndGetRowsInfo(IDictionary<string, object> inputMaps
}
}

// e.g <dimension ref=\"A1:B6\" /> only need to update B6 to BMaxRowIndex
var refs = dimension.GetAttribute("ref").Split(':');
// e.g <dimension ref=\"A1:B6\" /> we only need to update B6 to BMaxRowIndex
if (refs.Length == 2)
{
var letter = StringHelper.GetLetters(refs[1]);
var digit = StringHelper.GetNumber(refs[1]);

dimension.SetAttribute("ref", $"{refs[0]}:{letter}{digit + maxRowIndexDiff}");
}
else
{
var letter = StringHelper.GetLetters(refs[0]);
var digit = StringHelper.GetNumber(refs[0]);

dimension.SetAttribute("ref", $"A1:{letter}{digit + maxRowIndexDiff}");
}
}
Expand Down
25 changes: 25 additions & 0 deletions tests/MiniExcelTests/MiniExcelIssueTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3615,6 +3615,31 @@ public void Issue422()
Assert.Equal(1, enumerableWithCount.GetEnumeratorCount);
}

[Fact]
public void Issue459()
{
var template = PathHelper.GetFile("xlsx/TestIssue459.xlsx");
using var ms = new MemoryStream();
var values = new
{
title = "FooCompany",
managers = new[]
{
new { name = "Jack", department = "HR" },
new { name = "Loan", department = "IT" }
},
employees = new[]
{
new { name = "Wade", department = "HR" },
new { name = "Felix", department = "HR" },
new { name = "Eric", department = "IT" },
new { name = "Keaton", department = "IT" }
}
};

ms.SaveAsByTemplate(template, values);
}

private class Issue585VO1
{
public string Col1 { get; set; }
Expand Down
6 changes: 3 additions & 3 deletions tests/MiniExcelTests/MiniExcelOpenXmlTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1549,7 +1549,7 @@ public void DateOnlySupportTest()
public void SheetDimensionsTest()
{
var path1 = PathHelper.GetFile("xlsx/TestTypeMapping.xlsx");
var dim1 = MiniExcel.GetSheetsDimensions(path1);
var dim1 = MiniExcel.GetSheetDimensions(path1);
Assert.Equal("A1", dim1[0].StartCell);
Assert.Equal("H101", dim1[0].EndCell);
Assert.Equal(101, dim1[0].Rows.Count);
Expand All @@ -1560,7 +1560,7 @@ public void SheetDimensionsTest()
Assert.Equal(8, dim1[0].Columns.EndIndex);

var path2 = PathHelper.GetFile("xlsx/TestNoDimension.xlsx");
var dim2 = MiniExcel.GetSheetsDimensions(path2);
var dim2 = MiniExcel.GetSheetDimensions(path2);
Assert.Equal(101, dim2[0].Rows.Count);
Assert.Equal(7, dim2[0].Columns.Count);
Assert.Equal(1, dim2[0].Rows.StartIndex);
Expand All @@ -1573,7 +1573,7 @@ public void SheetDimensionsTest()
public void SheetDimensionsTest_MultiSheet()
{
var path = PathHelper.GetFile("xlsx/TestMultiSheet.xlsx");
var dim = MiniExcel.GetSheetsDimensions(path);
var dim = MiniExcel.GetSheetDimensions(path);

Assert.Equal("A1", dim[0].StartCell);
Assert.Equal("D12", dim[0].EndCell);
Expand Down
Loading