2016-09-06 40 views
1

我有一個從數據庫獲取數據然後將其放入網格的函數。我使用下面的代碼:如何從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; 

有很多嘗試嘗試獲取範圍然後設置一個數組或類似的東西。

我得到了一些無用的錯誤

「System.Runtime.InteropServices.COMException」類型的未處理的異常出現在AspireExcel.dll

如果有更好的方式來獲取數據到我可以將數據源直接傳遞給Excel的網格,或者我可以很好地處理這些數據。

我不知道這是否相關,但看着this我看到的Excel變量定義略有不同。當我試圖

using Microsoft.Office.Interop; 
using Microsoft.Office.Interop.Excel; 

Excel.Application XL = new Excel.Application(); 

我得到

類型或命名空間名稱「Excel的」找不到(是否缺少using指令或程序集引用?)的Excel C:\代碼\ Excel \ Excel \ Transfer.cs 190活動

我可以有錯誤的引用嗎?我有Microsoft.Office.Core & Microsoft.Office.Interop.Excel

+0

看看[EPPlus(http://epplus.codeplex.com),這是一個非常簡單的圖書館,可使用,而不用創建Excel文件的Interop – sallushan

回答

0

有很多方法可以完成您所要求的。看起來你對通過互操作庫使用Excel自動化有點熟悉,所以這裏用一個簡單的方法來完成任務。

該方法每次從DataTable寫入一行。這不會像將整個表格複製到2D陣列並將其分配給尺寸相同的Excel.Range一樣快,但在很多情況下,速度足夠快。它使用預定義的DataRow.ItemArray作爲源分配給Excel.Range。該方法的唯一輸入是DataTableExcel.Range,它定義了Excel.WorkSheet中的起始單元格地址。

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; 
    } 
} 
+0

做工不錯。謝謝。 – John

相關問題