2017-04-17 159 views
0

我有一个WinForm,这是为了过滤和显示我的数据库中的数据到它的DataGridView。为了过滤,我放置了一个combobox,其中显示了数据库中列的名称并且可以选择该名称,并且可以输入textbox,用户可以在其中输入关键字或短语。然后用户点击Filter按钮执行过滤。如何将过滤的数据从SQL Server导出到Excel?

我也有一个按钮来导出数据库表到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); 
     } 
    } 

的出口按钮的方法:

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文件得到所有从数据库中的数据。我能做些什么,因此Export按钮从已过滤的DataGridView获取数据?

请帮帮我。非常感谢你!

回答

1

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

DataTable dtFiltered = dv.ToTable(); 

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

要访问的数据视图dvexportIDLS_Click事件,声明类级别决策变量DV的成员变量:

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中,你可以在这里看到我的回答:

Export the dataGridView to Excel with all the cells format

enter image description here

+0

嗨!就像你说的那样,我尝试了ToTable()方法,并且我得到了一个空白的Excel文件。我把它放在'Export'按钮的方法上。我还为DataView创建了一个新实例。这里有什么问题? – ohmokipo

+0

此外,还有一个“过滤器”按钮,它使用searchFilter方法来进行过滤。我在那里放置ToTable()方法吗?谢谢! – ohmokipo

+0

请参阅我的编辑了解更多。 –