如何从SQL服务器获取数据到DataGridView然后到Excel

我有一个函数,从数据库获取数据,然后将其放入一个网格。 我使用下面的代码:

ds = new DataSet(); SQL = "SELECT * " + "FROM table "; using (SqlConnection conn = new SqlConnection(Connect)) { conn.Open(); adapter = new SqlDataAdapter(SQL, conn); adapter.Fill(ds, "data"); } dgvInvoiceData.DataSource = ds.Tables[0]; 

哪个运作良好。 有时用户可能希望将网格复制到Excel。 这对于小的结果集足够好。 一旦他们超过50行,它迅速接近无法使用。 我尝试设置一个范围到一个数组,但每次都失败。

 int cols = 0; int rows; _Application XL = new Microsoft.Office.Interop.Excel.Application(); _Workbook workbook = XL.Workbooks.Add(Type.Missing); _Worksheet worksheet = null; Range xlr; XL.Visible = false; worksheet = workbook.ActiveSheet; worksheet.Name = sheetName; xlr = worksheet.Range["A0:B02"]; xlr = worksheet.get_Range("A0:" + (char)(64 + cols) + rows.ToString()); xlr = worksheet.get_Range("A0:" + (char)(64 + cols) + rows.ToString(), Type.Missing); worksheet.get_Range("A0:" + (char)(64 + cols) + rows.ToString(), Type.Missing).Value2 = dt; 

有很多尝试去获得一个范围,然后设置一个数组或类似的东西。

我得到一些无用的错误

在AspireExcel.dll中发生未处理的“System.Runtime.InteropServices.COMException”types的exception

如果有更好的方法来获取数据到网格,我可以直接将数据源传递给Excel或我会很好的。

我不知道这是否相关,但看看这个我看到的Excelvariables定义略有不同。 当我尝试它

 using Microsoft.Office.Interop; using Microsoft.Office.Interop.Excel; Excel.Application XL = new Excel.Application(); 

我明白了

无法findtypes或名称空间名称“Excel”(是否缺lessusing指令或程序集引用?)Excel C:\ Code \ Excel \ Excel \ Transfer.cs 190活动

我可以有错误的参考? 我有Microsoft.Office.Core&Microsoft.Office.Interop.Excel

有很多方法可以完成你所要求的。 看起来,您对通过互操作库使用Excel自动化有一定的了解,所以这里用一个简单的方法来完成这个任务。

此方法从DataTable一次写入一行。 这不会像将整个表格复制到二维数组并将其分配给一个相同大小的Excel.Range一样快,但在很多情况下,它足够快。 它使用预定义的DataRow.ItemArray作为源分配给Excel.Range 。 该方法的唯一input是在Excel.WorkSheet中定义起始单元格地址的DataTableExcel.Range

using Excel = Microsoft.Office.Interop.Excel;

 private void ExportDT(DataTable dt, Microsoft.Office.Interop.Excel.Range topLeftCell) { Excel.Range exportRange = topLeftCell.Cells.get_Item(1, 1) as Excel.Range; exportRange = exportRange.get_Resize(1, dt.Columns.Count); // create and export header List<string> header = new List<string>(); foreach (DataColumn c in dt.Columns) { header.Add(c.ColumnName); } exportRange.Value2 = header.ToArray(); //export each row foreach (DataRow dr in dt.Rows) { exportRange = exportRange.get_Offset(1, 0); exportRange.Value2 = dr.ItemArray; } }