From 5c849223d861cabf6788240c62ab66eac3f8b2d5 Mon Sep 17 00:00:00 2001 From: Rollers Date: Mon, 27 Jun 2022 21:33:33 -0700 Subject: [PATCH] Added DataReader AutoFilter toggle --- .../OpenXml/ExcelOpenXmlSheetWriter.cs | 3 +- tests/MiniExcelTests/MiniExcelIssueTests.cs | 114 ++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs index 57bf832f..5682eaa6 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs +++ b/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs @@ -621,7 +621,8 @@ private void GenerateSheetByIDataReader(MiniExcelStreamWriter writer, IDataReade } } writer.Write(""); - writer.Write($""); + if (_configuration.AutoFilter) + writer.Write($""); writer.Write(""); } diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index 8888e8c1..3198d168 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -211,6 +211,120 @@ public void TestIssue352() } } + [Theory] + [InlineData(true, 1)] + [InlineData(false, 0)] + public void TestIssue401(bool autoFilter, int count) + { + // Test for DataTable + { + DataTable table = new DataTable(); + { + table.Columns.Add("id", typeof(int)); + table.Columns.Add("name", typeof(string)); + table.Rows.Add(1, "Jack"); + table.Rows.Add(2, "Mike"); + } + DataTableReader reader = table.CreateDataReader(); + var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx"; + var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; + MiniExcel.SaveAs(path, reader, configuration: config); + var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); + var cnt = Regex.Matches(xml, "").Count; + Assert.Equal(count, cnt); + File.Delete(path); + } + { + DataTable table = new DataTable(); + { + table.Columns.Add("id", typeof(int)); + table.Columns.Add("name", typeof(string)); + table.Rows.Add(1, "Jack"); + table.Rows.Add(2, "Mike"); + } + DataTableReader reader = table.CreateDataReader(); + var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx"; + var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; + MiniExcel.SaveAs(path, reader, false, configuration: config); + var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); + var cnt = Regex.Matches(xml, "").Count; + Assert.Equal(count, cnt); + File.Delete(path); + } + { + DataTable table = new DataTable(); + { + table.Columns.Add("id", typeof(int)); + table.Columns.Add("name", typeof(string)); + } + DataTableReader reader = table.CreateDataReader(); + var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx"; + var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; + MiniExcel.SaveAs(path, reader, configuration: config); + var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); + var cnt = Regex.Matches(xml, "").Count; + Assert.Equal(count, cnt); + File.Delete(path); + } + + // Test for DataReader + { + var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); + var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; + using (var connection = Db.GetConnection("Data Source=:memory:")) + { + using var command = new SQLiteCommand(@"select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2", connection); + connection.Open(); + using var reader = command.ExecuteReader(); + MiniExcel.SaveAs(path, reader, configuration: config); + } + var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); + var cnt = Regex.Matches(xml, "autoFilter").Count; + Assert.Equal(count, cnt); + File.Delete(path); + } + + { + var xlsxPath = @"../../../../../samples/xlsx/Test5x2.xlsx"; + var tempSqlitePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.db"); + var connectionString = $"Data Source={tempSqlitePath};Version=3;"; + + using (var connection = new SQLiteConnection(connectionString)) + { + connection.Execute(@"create table T (A varchar(20),B varchar(20));"); + } + + using (var connection = new SQLiteConnection(connectionString)) + { + connection.Open(); + using (var transaction = connection.BeginTransaction()) + using (var stream = File.OpenRead(xlsxPath)) + { + var rows = stream.Query(); + foreach (var row in rows) + connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction); + transaction.Commit(); + } + } + + var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); + var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; + using (var connection = new SQLiteConnection(connectionString)) + { + using var command = new SQLiteCommand("select * from T", connection); + connection.Open(); + using var reader = command.ExecuteReader(); + MiniExcel.SaveAs(path, reader, configuration: config); + } + + var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); + var cnt = Regex.Matches(xml, "autoFilter").Count; + Assert.Equal(count, cnt); + File.Delete(path); + File.Delete(tempSqlitePath); + } + } + [Fact] public async Task TestIssue307() {