过滤DataTable以仅包含与String匹配的列中的项目

时间:2017-07-13 11:10:28

标签: c# .net datatable spreadsheet epplus

我有 DataTable 绑定到 绑定源 ,形成 DataSource DataGridView

为了过滤DataGridView的内容,我设置了以下过滤器

bs.Filter = string.Format("Result LIKE '%{0}%'", "Match");

这很好。但是现在我需要将DataTable中的匹配项导出到Excel文件。我正在使用 EPPlus 库并使用我保存文件以下代码

                var excel = new OfficeOpenXml.ExcelPackage();
                var ws = excel.Workbook.Worksheets.Add("worksheet-name");
                // you can also use LoadFromCollection with an `IEnumerable<SomeType>`
                ws.Cells["A1"].LoadFromDataTable(mydatatable, true, OfficeOpenXml.Table.TableStyles.Light1);
                ws.Cells[ws.Dimension.Address.ToString()].AutoFitColumns();    
                using (var file = File.Create(dia.FileName))
                excel.SaveAs(file);

我如何以与使用DataGridView类似的方式过滤DataTable中的项目?

2 个答案:

答案 0 :(得分:1)

您可以使用Select()方法过滤数据表,将结果复制到新数据表中并使用它来加载工作表。试试这个:

var expression = string.Format("Result LIKE '%{0}%'", "Match");
var filteredResults = sourceTable.Select(expression).CopyToDataTable();
ws.Cells["A1"].LoadFromDataTable(filteredResults, true, OfficeOpenXml.Table.TableStyles.Light1);

答案 1 :(得分:0)

将数据源转换为DataTable并使用包含已过滤数据的DataTable.DefaultView属性。

var source = (BindingSource)datagridView.DataSource;
var data = (DataTable)source.DataSource;
var filteredData = data.DefaultView.ToTable();

为了过滤DataTable,使用Select方法并传递相同的表达式

var filterBy = "Match";
var filter = $"Result LIKE '%{filterBy}%'"
var fileteredRows = originalDataTable.Select(filter).CopyToDataTable();