繁体   English   中英

如何将筛选的数据从SQL Server导出到Excel?

[英]How Can I Export Filtered Data from SQL Server to Excel?

我有一个WinForm ,用于过滤和显示数据库中的数据到DataGridView 为了进行过滤,我放置了一个combobox ,用于显示和选择数据库中各列的名称,还有一个textbox ,供用户键入关键字或短语。 然后,用户单击“ Filter按钮以执行过滤。

我还有一个按钮可以将数据库表导出到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获取数据?

请帮我。 非常感谢你!

使用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 ,请在类级别声明变量,使dv成为成员变量:

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

或在exportIDLS_Click事件中,从DataGridViews数据源获取DataView:

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

如果要在Excel中保留网格样式,则可以在这里查看我的答案:

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM