我做了一个winform现在希望通过点击按钮把sql里指定表(手动指定要如何设计?)的数据导出到Excel。
还有一个是点击把datagridview里面的数据导出到excel怎么写,还请大家指点一下~

解决方案 »

  1.   


            private void SaveAs(DataGridView dgvAgeWeekSex)
            {
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "Execl 97-2003 (*.xls)|*.xls|Execl 2007 (*.xlsx)|*.xlsx";
                saveFileDialog.FilterIndex = 0;
                saveFileDialog.RestoreDirectory = true;
                saveFileDialog.CreatePrompt = true;
                saveFileDialog.Title = "Netbor Export Dialog";
                saveFileDialog.ShowDialog();
                Stream myStream;
                myStream = saveFileDialog.OpenFile();
                StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
                string str = "";
                try
                {
                    for (int i = 0; i < dgvAgeWeekSex.ColumnCount; i++)
                    {
                        if (i > 0)
                        {
                            str += "\t";
                        }
                        str += dgvAgeWeekSex.Columns[i].HeaderText;
                    }
                    sw.WriteLine(str);
                    for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++)
                    {
                        string tempStr = "";
                        for (int k = 0; k < dgvAgeWeekSex.Columns.Count; k++)
                        {
                            if (k > 0)
                            {
                                tempStr += "\t";
                            }
                            tempStr += dgvAgeWeekSex.Rows[j].Cells[k].Value.ToString();
                        }
                        sw.WriteLine(tempStr);
                    }
                    sw.Close();
                    myStream.Close();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
                finally
                {
                    sw.Close();
                    myStream.Close();
                }
            }
      

  2.   

    用oledb连接你的excel(需要事先创建一个模板,即带有标题列)
    把sql server的数据读到datatable或者reader里,循环结果集,拼insert sql语句来写入xls文件.
    最后把连接关掉
    dgv也一样,如果数据源是dataset或者datatable就如上炮制,要么就循环dgv的rows,然后还是取每个cell的值来拼sql
      

  3.   

    1楼的方法是按文本方式写,老版本的xls可能会不认
      

  4.   

    private void button1_Click(object sender, EventArgs e)
            {
                string pathName = System.Windows.Forms.Application.StartupPath.Trim();
                string dateTime = txtdatatime.Text.Split(char.Parse("-"))[0] + "年" + txtdatatime.Text.Split(char.Parse("-"))[1] + "月";            int count = 0;
                FileInfo mode = new FileInfo(pathName + "\\model\\Name.xls");
                try
                {
                    mode.CopyTo(pathName + "\\temp\\" + dateTime + " 产品名称.xls", true);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                object ming = Type.Missing;
                Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();
                myExcel.Application.Workbooks.Open(pathName + "\\temp\\" + dateTime + " 产品名称.xls", ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming);
                myExcel.Visible = false;            Excel.Workbook myBook = myExcel.Workbooks[1];
                Excel.Worksheet mySheet = (Excel.Worksheet)myBook.Worksheets[1];            databind();            try
                {
                    if (ds.Tables.Contains("tblClass"))//如果有这个表就把改表的内容清空
                    {
                        ds.Tables["tblClass"].Clear();
                    }
                    da.Fill(ds, "tblClass");
                    count = ds.Tables["tblClass"].Rows.Count;//表中的数据的总行数
                      dataGridView1.DataSource = ds.Tables["tblClass"];                if (count == 0)
                    {
                        MessageBox.Show("没有可打印的数据!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    else
                    {
                        myExcel.Cells[2, 3] = dateTime;//显示时间的位置                       for (int i = 0; i < count; i++)
                        {
                            ((Excel.Range)mySheet.Cells[i + 3, 1]).EntireRow.Insert(0, Excel.XlDirection.xlDown);  //添加行                        mySheet.Cells[i  + 3, 1] = ds.Tables["tblClass"].Rows[i][0].ToString();
                            mySheet.Cells[i  + 3, 2] = ds.Tables["tblClass"].Rows[i][1].ToString();
                        }
                    }
                    Excel.Range r = mySheet.get_Range(mySheet.Cells[3, 1], mySheet.Cells[2 + count, 2]);
                    r.Select();
                    myExcel.Run("Macro1",ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming);
                    myBook.Save();
                    myExcel.Visible = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    if (myBook != null)
                    {
                        myBook.Close(false, ming, ming);
                    }
                    myExcel.Workbooks.Close();
                    myExcel.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
                }
                finally
                {
                    da.Dispose();
                }
            }你可以根据情况来改
      

  5.   

    楼上的要用引用OFFICE,有很大的版问题,引的哪个版就只能导入哪个版本的EXCEL,不灵活,还是用流通用性强.
      

  6.   

    用这个语句在查询分析器上可以:
    EXEC master..xp_cmdshell 'bcp "select * from test.dbo.LS_Tab" queryout C:\Excel.xls -c -S192.168.1.100 -Usa -Psa' 
    不知道怎么搬到C#中就没用了.........不知道为什么
      

  7.   


    这个也可以用的,去掉EXEC直接master..xp_cmdshell ..................           就可以了
      

  8.   

    关于在Sheet中插入一行的过程中我遇到了问题,插入一行的格式总是不对。
    看了这个贴我的问题解决了,修改代码如下:Range.EntireRow.Insert(0, XlDirection.xlDown);非常感谢!