Skip to content

Commit 7be1bca

Browse files
authored
Merge pull request #402 from Rollerss/FixAutoFilter
Added DataReader AutoFilter toggle
2 parents ce9d5c9 + 5c84922 commit 7be1bca

File tree

2 files changed

+116
-1
lines changed

2 files changed

+116
-1
lines changed

src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,8 @@ private void GenerateSheetByIDataReader(MiniExcelStreamWriter writer, IDataReade
621621
}
622622
}
623623
writer.Write("</x:sheetData>");
624-
writer.Write($"<x:autoFilter ref=\"A1:{ExcelOpenXmlUtils.ConvertXyToCell((xIndex-1)/*TODO:code smell*/, yIndex-1)}\" />");
624+
if (_configuration.AutoFilter)
625+
writer.Write($"<x:autoFilter ref=\"A1:{ExcelOpenXmlUtils.ConvertXyToCell((xIndex-1)/*TODO:code smell*/, yIndex-1)}\" />");
625626
writer.Write("</x:worksheet>");
626627
}
627628

tests/MiniExcelTests/MiniExcelIssueTests.cs

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,120 @@ public void TestIssue352()
211211
}
212212
}
213213

214+
[Theory]
215+
[InlineData(true, 1)]
216+
[InlineData(false, 0)]
217+
public void TestIssue401(bool autoFilter, int count)
218+
{
219+
// Test for DataTable
220+
{
221+
DataTable table = new DataTable();
222+
{
223+
table.Columns.Add("id", typeof(int));
224+
table.Columns.Add("name", typeof(string));
225+
table.Rows.Add(1, "Jack");
226+
table.Rows.Add(2, "Mike");
227+
}
228+
DataTableReader reader = table.CreateDataReader();
229+
var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx";
230+
var config = new OpenXmlConfiguration { AutoFilter = autoFilter };
231+
MiniExcel.SaveAs(path, reader, configuration: config);
232+
var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml");
233+
var cnt = Regex.Matches(xml, "<x:autoFilter ref=\"A1:B3\" />").Count;
234+
Assert.Equal(count, cnt);
235+
File.Delete(path);
236+
}
237+
{
238+
DataTable table = new DataTable();
239+
{
240+
table.Columns.Add("id", typeof(int));
241+
table.Columns.Add("name", typeof(string));
242+
table.Rows.Add(1, "Jack");
243+
table.Rows.Add(2, "Mike");
244+
}
245+
DataTableReader reader = table.CreateDataReader();
246+
var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx";
247+
var config = new OpenXmlConfiguration { AutoFilter = autoFilter };
248+
MiniExcel.SaveAs(path, reader, false, configuration: config);
249+
var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml");
250+
var cnt = Regex.Matches(xml, "<x:autoFilter ref=\"A1:B2\" />").Count;
251+
Assert.Equal(count, cnt);
252+
File.Delete(path);
253+
}
254+
{
255+
DataTable table = new DataTable();
256+
{
257+
table.Columns.Add("id", typeof(int));
258+
table.Columns.Add("name", typeof(string));
259+
}
260+
DataTableReader reader = table.CreateDataReader();
261+
var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx";
262+
var config = new OpenXmlConfiguration { AutoFilter = autoFilter };
263+
MiniExcel.SaveAs(path, reader, configuration: config);
264+
var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml");
265+
var cnt = Regex.Matches(xml, "<x:autoFilter ref=\"A1:B1\" />").Count;
266+
Assert.Equal(count, cnt);
267+
File.Delete(path);
268+
}
269+
270+
// Test for DataReader
271+
{
272+
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
273+
var config = new OpenXmlConfiguration { AutoFilter = autoFilter };
274+
using (var connection = Db.GetConnection("Data Source=:memory:"))
275+
{
276+
using var command = new SQLiteCommand(@"select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2", connection);
277+
connection.Open();
278+
using var reader = command.ExecuteReader();
279+
MiniExcel.SaveAs(path, reader, configuration: config);
280+
}
281+
var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml");
282+
var cnt = Regex.Matches(xml, "autoFilter").Count;
283+
Assert.Equal(count, cnt);
284+
File.Delete(path);
285+
}
286+
287+
{
288+
var xlsxPath = @"../../../../../samples/xlsx/Test5x2.xlsx";
289+
var tempSqlitePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.db");
290+
var connectionString = $"Data Source={tempSqlitePath};Version=3;";
291+
292+
using (var connection = new SQLiteConnection(connectionString))
293+
{
294+
connection.Execute(@"create table T (A varchar(20),B varchar(20));");
295+
}
296+
297+
using (var connection = new SQLiteConnection(connectionString))
298+
{
299+
connection.Open();
300+
using (var transaction = connection.BeginTransaction())
301+
using (var stream = File.OpenRead(xlsxPath))
302+
{
303+
var rows = stream.Query();
304+
foreach (var row in rows)
305+
connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction);
306+
transaction.Commit();
307+
}
308+
}
309+
310+
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
311+
var config = new OpenXmlConfiguration { AutoFilter = autoFilter };
312+
using (var connection = new SQLiteConnection(connectionString))
313+
{
314+
using var command = new SQLiteCommand("select * from T", connection);
315+
connection.Open();
316+
using var reader = command.ExecuteReader();
317+
MiniExcel.SaveAs(path, reader, configuration: config);
318+
}
319+
320+
var xml = Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml");
321+
var cnt = Regex.Matches(xml, "autoFilter").Count;
322+
Assert.Equal(count, cnt);
323+
File.Delete(path);
324+
File.Delete(tempSqlitePath);
325+
}
326+
}
327+
214328
[Fact]
215329
public async Task TestIssue307()
216330
{

0 commit comments

Comments
 (0)