如何将过滤的数据从SQL Server导出到Excel?

我有一个WinForm是为了筛选和显示我的数据库中的数据到它的DataGridView 。 为了过滤,我放置了一个combobox ,显示数据库中列的名称,并可以select,还有一个用户可以input关键字或短语的textbox 。 然后用户点击Filterbutton来执行过滤。

我也有一个button来导出数据库表到一个Excel文件。

我的过滤方法:

 protected void searchFilter() { DataTable dt; BindingSource bs = new BindingSource(); _db.conn(); _db.cmd.CommandText = "SELECT * FROM IncomingLog"; dt = _db.executeDT(); DataView dv = new DataView(dt); incomLogTableS.DataSource = dv; String cmbCat = cmbFilterIDLS.GetItemText(cmbFilterIDLS.SelectedValue.ToString()); String keyID = keyIDLS.Text; if (cmbCat != "Select Category") { if (cmbCat == "Received Date") { dv.RowFilter = string.Format("[Date Received] LIKE '%{0}%'", keyID); } else if (cmbCat == "Reference Number") { dv.RowFilter = string.Format("[Reference Number] LIKE '%{0}%'", keyID); } else if (cmbCat == "Received Time") { dv.RowFilter = string.Format("[Time Received] LIKE '%{0}%'", keyID); } else if (cmbCat == "Title/Description") { dv.RowFilter = string.Format("[Title/Description] LIKE '%{0}%'", keyID); } else if (cmbCat == "Originating Office") { dv.RowFilter = string.Format("[Originating Office] LIKE '%{0}%'", keyID); } else if (cmbCat == "Received By") { dv.RowFilter = string.Format("[Receiving Person] LIKE '%{0}%'", keyID); } else if (cmbCat == "Filed Under") { dv.RowFilter = string.Format("[Filed Under] LIKE '%{0}%'", keyID); } else { dv.RowFilter = string.Format("[Encoded By] LIKE '%{0}%'", keyID); } } else { MessageBox.Show("Please select a category to search!", "Select category", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } if (dv.Count == 0) { MessageBox.Show("No records found! \nPlease try with different keyword(s).", "(0) Records Found", MessageBoxButtons.OK, MessageBoxIcon.Information); } } 

导出button的方法:

 private void exportIDLS_Click(object sender, EventArgs e) { searchFilter(); string data = null; int i = 0; int j = 0; Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; Excel.Range range; object misValue = System.Reflection.Missing.Value; xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); DataSet ds = new DataSet(); ds.Tables.Add(dt); for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) { for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) { xlWorkSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; range = xlWorkSheet.Cells[1, j + 1]; range.Interior.ColorIndex = 15; range.Font.Bold = true; range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; data = ds.Tables[0].Rows[i].ItemArray[j].ToString(); xlWorkSheet.Cells[i + 2, j + 1] = data; } } Microsoft.Office.Interop.Excel.Range columns = xlWorkSheet.UsedRange.Columns; columns.AutoFit(); xlApp.StandardFont = "Arial"; xlApp.StandardFontSize = 11; xlWorkSheet.Rows[1].Insert(); Excel.Range newRow = xlWorkSheet.Rows[1]; Excel.Range newCell = newRow.Cells[1]; newCell.Value = "Incoming Documents Log Summary"; newCell.Font.Size = 12; newCell.Font.Bold = true; xlWorkBook.SaveAs("Incoming Documents Log Summary.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); MessageBox.Show("Success! Incoming Documents Log Summary.xls is created! \nPlease look at the Documents folder.", "Excel file created!", MessageBoxButtons.OK, MessageBoxIcon.Information); } 

这是现在正在工作,但导出的Excel文件从数据库中获取所有的数据。 我能做些什么, Exportbutton从过滤的DataGridView获取数据?

请帮帮我。 非常感谢你!

使用DataView.ToTable方法获取过滤的结果:

 DataTable dtFiltered = dv.ToTable(); for (i = 0; i <= dtFiltered.Rows.Count - 1; i++) { for (j = 0; j <= dtFiltered.Columns.Count - 1; j++) { 

要访问exportIDLS_Click事件中的DataView dv ,请在类级别声明variables,使其成为variablesdv:

 private DataView m_dv = null; protected void searchFilter() { ... m_dv = new DataView(dt); 

或者在exportIDLS_Click事件中,从DataGridViews DataSource获取DataView:

 DataView dv = (DataView)incomLogTableS.DataSource; DataTable dtFiltered = dv.ToTable(); 

如果你想在Excel中保持网格样式,你可以在这里看到我的答案:

使用所有单元格格式将dataGridView导出到Excel :

在这里输入图像说明