使用过滤器将DataGridView导出到Excel c#

时间:2017-11-06 10:51:54

标签: c# excel datagridview

我有一些代码可以成功地将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调用有关。我猜我现在需要使用略有不同的方法,因为这会改变这种方式吗?

1 个答案:

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