C# 筛选DataTable以仅包括与字符串匹配的列中的项

C# 筛选DataTable以仅包括与字符串匹配的列中的项,c#,.net,datatable,epplus,C#,.net,Datatable,Epplus,我有一个DataTable,它绑定到一个绑定源,该绑定源构成DataGridView的数据源 为了过滤DataGridView的内容,我设置了以下过滤器 bs.Filter = string.Format("Result LIKE '%{0}%'", "Match"); 这很好。但是现在我需要将DataTable中匹配的项导出到Excel文件中。我正在使用EPPlus库,并使用以下代码保存文件 var excel = new OfficeOpenXml.ExcelPackage(); var

我有一个DataTable,它绑定到一个绑定源,该绑定源构成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中的项?

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

var source = (BindingSource)datagridView.DataSource;
var data = (DataTable)source.DataSource;
var filteredData = data.DefaultView.ToTable();
对于筛选数据表,请使用Select方法并将相同的表达式传递给该方法

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

您可以使用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);

我不能使用此方法,因为我不想在datatable中向用户显示已过滤的数据。我想在内部进行过滤。@jim,即使您不想向用户显示已过滤的数据,您仍然可以使用答案中提供的DefaultView技术。DefaultView是的一个实例。您可以使用所需的筛选器创建DataTable的DataView,并在该视图上调用ToTable方法。这是否回答了您的问题?如果是这样,请不要忘记将其标记为答案。谢谢