2016-09-06 7 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ディレクティブまたはアセンブリ参照が不足している?)エクセルC:\コード\ Excel \ Excel \ Transfer.cs 190アクティブ

私は間違った参照がありますか?私はMicrosoft.Office.Coreを持っています& Microsoft.Office.Interop.Excel

+0

[EPPlus](http://epplus.codeplex.com)を見てみましょう、それが良い作品 – sallushan

答えて

0

あなたが尋ねたことを達成する方法はたくさんあります。 interopライブラリを使用してExcel Automationを使用することに多少慣れているようですので、ここではそれを使用してタスクを実行する単純な方法があります。

このメソッドは、DataTableから一度に1行を書き込みます。これは、テーブル全体を2D配列にコピーし、それを同じサイズのExcel.Rangeに割り当てるほど速くはありませんが、多くの場合、十分に速いです。定義済みのDataRow.ItemArrayを直接ソースとして使用してExcel.Rangeに割り当てます。この方法の唯一の入力は、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; 
    } 
} 
+0

相互運用機能を使用せずにExcelファイルを作成するために使用することができる非常に簡単なライブラリです。ありがとう。 – John

関連する問題