将DataGridView导出到使用筛选器的Excel中c#

我有一些代码,从我的程序成功地将DataGridView导出到Excel电子表格。 但是,当filter应用到grid它只导出标题并且不导出数据。

下面是实际写入数据的代码:

 // storing header part in Excel for (int i = 1; i < dataGridView_assets.Columns.Count + 1; i++) { worksheet.Cells[1, i] = dataGridView_assets.Columns[i - 1].HeaderText; } // storing Each row and column value to excel sheet for (int i = 0; i < dataGridView_assets.Rows.Count - 1; i++) { for (int j = 0; j < dataGridView_assets.Columns.Count; j++) { worksheet.Cells[i + 2, j + 1] = dataGridView_assets.Rows[i].Cells[j].Value.ToString(); } } 

我用来添加filter到我的数据的代码如下:

 DataView typeFilter = new DataView(allAssetsDT, filter, "[Barcode] ASC", DataViewRowState.CurrentRows); dataGridView_assets.DataSource = typeFilter; 

有没有办法只导出应用filter时仍然可以看到的数据?

编辑:使用给出的答案我现在有以下几行代码的问题:

 worksheet.Cells[1, i] = dtFiltered.Columns[i - 1].HeaderText; 

上面的问题是.HeaderText。

 worksheet.Cells[i + 2, j + 1] = dtFiltered.Rows[i].Cells[j].Value.ToString(); 

上述问题与.Cells调用有关。 我猜我现在需要使用稍微不同的方法来改变这种方式吗?

你必须使用DataView。

使typeFilter成为一个私有成员variables。

然后,当您导出为Excel时,请不要使用dataGridView_assets ,像这样使用从DataView中过滤的DataTable:

 DataTable dtFiltered = typeFilter.ToTable(); 

提示:您不应该导出Cell by Cell,这很慢。 而是一次性导出所有单元格,例如: Excel Interop – 效率和性能

你可以这样做(所有的细胞一次)带有这个问题的DataGridView,如果你需要格式化,你可以使用答案: 导出dataGridView到所有的单元格格式的Excel

要使用DataTable的现有代码:

 // storing header part in Excel int i=0; foreach (DataColumn dc in dtFiltered.Columns) { i++; worksheet.Cells[1, i] = dc.ColumnName); } int j=1; foreach (DataRow dr in dtFiltered.Rows) { j++; for (i = 0; i < dtFiltered.Columns.Count; i++) { worksheet.Cells[j, i + 1] = dr[i].ToString()); } }