diff --git a/samples/xlsx/Issue888_DataWithFrame.xlsx b/samples/xlsx/Issue888_DataWithFrame.xlsx new file mode 100644 index 00000000..f65045ab Binary files /dev/null and b/samples/xlsx/Issue888_DataWithFrame.xlsx differ diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs b/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs index a898d771..f3ee77db 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs @@ -200,10 +200,10 @@ internal static async Task CreateAsync(Stream stream, IMiniExcelC if (rowIndex < startRowIndex) { - await XmlReaderHelper.ReadFirstContentAsync(reader, cancellationToken) - .ConfigureAwait(false); - await XmlReaderHelper.SkipToNextSameLevelDomAsync(reader, cancellationToken) - .ConfigureAwait(false); + if (await XmlReaderHelper.ReadFirstContentAsync(reader, cancellationToken).ConfigureAwait(false)) + { + await XmlReaderHelper.SkipToNextSameLevelDomAsync(reader, cancellationToken).ConfigureAwait(false); + } continue; } diff --git a/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs index a4b1041f..e6143427 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs @@ -1329,10 +1329,8 @@ public async Task Issue153() public void Issue137() { const string path = "../../../../../samples/xlsx/TestIssue137.xlsx"; - var config = new OpenXmlConfiguration { Culture = new CultureInfo("it")}; - { - var q = _excelImporter.QueryAsync(path, configuration: config).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); @@ -1368,7 +1366,7 @@ public void Issue137() // dynamic query with head { - var q = _excelImporter.QueryAsync(path, true, configuration: config).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); @@ -1390,7 +1388,7 @@ public void Issue137() } { - var q = _excelImporter.QueryAsync(path, configuration: config).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(10, rows.Count); @@ -1423,10 +1421,8 @@ private class Issue137ExcelRow public void Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; - var config = new OpenXmlConfiguration { Culture = new CultureInfo("it") }; - { - var q = _excelImporter.QueryAsync(path, true, configuration: config).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); @@ -1452,7 +1448,7 @@ public void Issue138() } { - var q = _excelImporter.QueryAsync(path, configuration: config).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); diff --git a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs index 769856e6..1d64866b 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs @@ -2527,10 +2527,8 @@ public void Issue153() public void Issue137() { const string path = "../../../../../samples/xlsx/TestIssue137.xlsx"; - var config = new OpenXmlConfiguration { Culture = new CultureInfo("it") }; - { - var rows = _excelImporter.Query(path, configuration: config).ToList(); + var rows = _excelImporter.Query(path).ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); Assert.Equal(11, rows.Count); @@ -2564,7 +2562,7 @@ public void Issue137() // dynamic query with head { - var rows = _excelImporter.Query(path, true, configuration: config).ToList(); + var rows = _excelImporter.Query(path, true).ToList(); var first = rows[0] as IDictionary; //![image](https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png) Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); Assert.Equal(10, rows.Count); @@ -2584,7 +2582,7 @@ public void Issue137() } { - var rows = _excelImporter.Query(path, configuration: config).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(10, rows.Count); { var row = rows[0]; @@ -2615,11 +2613,8 @@ private class Issue137ExcelRow public void Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; - var config = new OpenXmlConfiguration { Culture = new CultureInfo("zh") }; - config.Culture.NumberFormat.NumberDecimalSeparator = ","; - { - var rows = _excelImporter.Query(path, true, configuration: config).ToList(); + var rows = _excelImporter.Query(path, true).ToList(); Assert.Equal(6, rows.Count); foreach (var index in new[] { 0, 2, 5 }) @@ -2644,7 +2639,7 @@ public void Issue138() } { - var rows = _excelImporter.Query(path, configuration: config).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); @@ -2774,10 +2769,11 @@ public void Issue422() new { Row1 = "1", Row2 = "2" }, new { Row1 = "3", Row2 = "4" } }; - var enumerableWithCount = new Issue422Enumerable(items); + using var path = AutoDeletingPath.Create(); - _excelExporter.Export(path.ToString(), enumerableWithCount); + _excelExporter.Export(path.ToString(), enumerableWithCount); + Assert.Equal(1, enumerableWithCount.GetEnumeratorCount); } @@ -2855,7 +2851,7 @@ WITH test('Id', 'Name') AS ( using var reader = cmd.ExecuteReader(); using var path = AutoDeletingPath.Create(); - _excelExporter.Export(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); + _excelExporter.Export(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); var rows = _excelImporter.Query(path.FilePath).ToList(); Assert.All(rows, x => Assert.Single(x)); @@ -3765,4 +3761,30 @@ public void TestIssue881() _ = _excelImporter.Query(PathHelper.GetFile("xlsx/TestIssue881.xlsx")).ToList(); }); } + + private record ExcelDataRow(string Key, string Value) + { + public ExcelDataRow() : this("", "") { } + } + + /// + /// https://github.com/mini-software/MiniExcel/issues/888 + /// + [Fact] + public void TestIssue888_ShouldIgnoreFrame() + { + var xlsxPath = PathHelper.GetFile("xlsx/Issue888_DataWithFrame.xlsx"); + ExcelDataRow[] dataInSheet = + [ + new("Key1", "Value1"), + new("Key2", "Value2") + ]; + + // Act + using var stream = File.OpenRead(xlsxPath); + var dataRead = _excelImporter.Query(stream, startCell: "A2").ToArray(); + + Assert.Equal(dataInSheet, dataRead); + } + } \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index dee3097b..64a11d39 100644 --- a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -343,9 +343,7 @@ public async Task TestIEnumerableType() }; await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var config = new OpenXmlConfiguration { Culture = new CultureInfo("it") }; - - var rows = _excelImporter.Query(path.ToString(), configuration: config).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -409,9 +407,7 @@ public async Task TestTemplateTypeMapping() }; await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var config = new OpenXmlConfiguration { Culture = new CultureInfo("it") }; - - var rows = _excelImporter.Query(path.ToString(), configuration: config).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); diff --git a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs index 09a84754..6dcabfaa 100644 --- a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -519,9 +519,7 @@ public void TestIEnumerableType() }; _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var config = new OpenXmlConfiguration { Culture = new CultureInfo("it") }; - - var rows = _excelImporter.Query(path.ToString(), configuration: config).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -589,9 +587,7 @@ public void TestTemplateTypeMapping() }; _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var config = new OpenXmlConfiguration { Culture = new CultureInfo("it") }; - - var rows = _excelImporter.Query(path.ToString(), configuration: config).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double);