我有一些代码可以成功地将DataGridView
导出到我的程序中的Excel电子表格中。但是,当过滤器应用于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();
}
}
我用于将过滤器添加到我的数据的代码如下:
DataView typeFilter = new DataView(allAssetsDT, filter, "[Barcode] ASC", DataViewRowState.CurrentRows);
dataGridView_assets.DataSource = typeFilter;
有没有办法只导出应用过滤器时仍然可以查看的数据?
编辑:使用给出的答案我现在遇到以下代码行的问题:
worksheet.Cells[1, i] = dtFiltered.Columns[i - 1].HeaderText;
以上问题是.HeaderText。
worksheet.Cells[i + 2, j + 1] = dtFiltered.Rows[i].Cells[j].Value.ToString();
以上问题与.Cells调用有关。我猜我现在需要使用略有不同的方法,因为这会改变这种方式吗?
答案 0 :(得分:1)
您必须使用DataView。
使typeFilter
成为范围内的私有成员变量。
然后当您导出到excel时,不要使用dataGridView_assets
,请使用DataView中的过滤DataTable,如下所示:
DataTable dtFiltered = typeFilter.ToTable();
提示:您不应该逐个单元格导出,这非常慢。而是一次性导出所有单元格,例如:Excel Interop - Efficiency and performance
你可以使用带有这个问题的DataGridView做到这一点(所有单元格一次),如果你需要格式化你可以使用答案:Export the dataGridView to Excel with all the cells format
将现有代码与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());
}
}