From 9d46f10c93c1270992bff5781848cef59ebb239c Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sat, 25 Oct 2025 14:22:09 +0200 Subject: [PATCH 1/2] Reverting unnecessary test changes from #886 --- .../MiniExcelIssueAsyncTests.cs | 14 +++++------- .../MiniExcelIssueTests.cs | 22 ++++++++----------- .../MiniExcelTemplateAsyncTests.cs | 8 ++----- .../SaveByTemplate/MiniExcelTemplateTests.cs | 8 ++----- 4 files changed, 18 insertions(+), 34 deletions(-) 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..00fe4ef4 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)); 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); From 085f1448a98dfc55b2526194a91f74b543e6fbb9 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sat, 25 Oct 2025 14:26:06 +0200 Subject: [PATCH 2/2] Fixes #888 by ignoring empty rows Applies fixes PR #890 to the main branch Co-Authored-By: Paul Rohorzka --- samples/xlsx/Issue888_DataWithFrame.xlsx | Bin 0 -> 10157 bytes src/MiniExcel.Core/OpenXml/OpenXmlReader.cs | 8 +++--- .../MiniExcelIssueTests.cs | 26 ++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 samples/xlsx/Issue888_DataWithFrame.xlsx diff --git a/samples/xlsx/Issue888_DataWithFrame.xlsx b/samples/xlsx/Issue888_DataWithFrame.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f65045ab84e07dfcb768fd5d89c3f989c846f03a GIT binary patch literal 10157 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 literal 0 HcmV?d00001 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/MiniExcelIssueTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs index 00fe4ef4..1d64866b 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs @@ -3761,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