将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()); } }