2012-02-28 13 views
4

Gridviewを使用せずに、C#でデータセットまたはデータテーブルからExcelファイルにデータをエクスポートしたいとします。C#でデータセットまたはデータテーブルからExcelをエクスポートするにはどうすればよいですか?

+0

@Pankaj:編集時に、「してください」、「感謝」などの感想を削除してください。我々は短くて甘いことを目指している。 :) – sarnold

答えて

7

は、より多くの方法を取得:9 Solutions to Export Data to Excel for ASP.NET

私はこのコードを持っていますが、このために、あなたがあなたのための作業を行いますエクセルCOMコンポーネント

プロジェクトでMicrosoft.Office.Interop.Excel.dllの参照を追加します含める必要があります。

using Excel = Microsoft.Office.Interop.Excel; 
public static bool ExportDataTableToExcel(DataTable dt, string filepath) 
    { 

    Excel.Application oXL; 
    Excel.Workbook oWB; 
    Excel.Worksheet oSheet; 
    Excel.Range oRange; 

    try 
    { 
     // Start Excel and get Application object. 
     oXL = new Excel.Application(); 

     // Set some properties 
     oXL.Visible = true; 
     oXL.DisplayAlerts = false; 

     // Get a new workbook. 
     oWB = oXL.Workbooks.Add(Missing.Value); 

     // Get the Active sheet 
     oSheet = (Excel.Worksheet)oWB.ActiveSheet; 
     oSheet.Name = "Data"; 

     int rowCount = 1; 
     foreach (DataRow dr in dt.Rows) 
     { 
      rowCount += 1; 
      for (int i = 1; i < dt.Columns.Count + 1; i++) 
      { 
       // Add the header the first time through 
       if (rowCount == 2) 
       { 
        oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
       } 
       oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
      } 
     } 

     // Resize the columns 
     oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
         oSheet.Cells[rowCount, dt.Columns.Count]); 
     oRange.EntireColumn.AutoFit(); 

     // Save the sheet and close 
     oSheet = null; 
     oRange = null; 
     oWB.SaveAs(filepath, Excel.XlFileFormat.xlWorkbookNormal, 
      Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
      Excel.XlSaveAsAccessMode.xlExclusive, 
      Missing.Value, Missing.Value, Missing.Value, 
      Missing.Value, Missing.Value); 
     oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
     oWB = null; 
     oXL.Quit(); 
    } 
    catch 
    { 
     throw; 
    } 
    finally 
    { 
     // Clean up 
     // NOTE: When in release mode, this does the trick 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
    } 

    return true; 
} 
+0

GCを明示的に呼び出す代わりに、データテーブルやその他のExcelオブジェクトを手動で処理することはできますか?それぞれのdispose関数を呼び出すことによって? – Pankaj

+0

dispose関数を呼び出すと、GCがどのオブジェクトを破棄することができるかを見つけるのではなく、GCキューにオブジェクトが送信されます。 – Pankaj

+0

COMの使用が遅く、Excelをサーバーにインストールする必要があります。スプレッドシートを生成するたびに、Excelプロセスを開始する必要があります。 Webサーバー上で実行されている複数のExcelプロセスが終了する可能性があります。さらに、ライセンスが必要です。 –

1

あなたは "ネイティブ" Excel文書で作業する

using Microsoft.Office.Interop.Excel; 

を使用することができます...

エクセル文書 http://www.codeproject.com/Articles/20228/Using-C-to-Create-an-Excel-Document

を作成するためにC#を使用したが、共通のほとんどレポートジェネレータ/デザイナは簡単にExcelにエクスポートすることができます もチェックしてくださいこのソリューションは、COM相互運用機能やDLLを必要とし、非常に高速ではありません - サービスあなたはのSQL Server

9

を使用している場合は、私がEPPlusをお勧めします。 Webシナリオに最適です。誰かが選択したソリューションを使用して例外「get_Rangeの定義が含まれていないオブジェクト」に遭遇念のhttp://nuget.org/packages/EPPlus

private void DumpExcel(DataTable tbl) 
{ 
    using (ExcelPackage pck = new ExcelPackage()) 
    { 
      //Create the worksheet 
      ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo"); 

      //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1 
      ws.Cells["A1"].LoadFromDataTable(tbl, true); 

      //Format the header for column 1-3 
      using (ExcelRange rng = ws.Cells["A1:C1"]) 
      { 
       rng.Style.Font.Bold = true; 
       rng.Style.Fill.PatternType = ExcelFillStyle.Solid;      //Set Pattern for the background to Solid 
       rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(79, 129, 189)); //Set color to dark blue 
       rng.Style.Font.Color.SetColor(Color.White); 
      } 

      //Example how to Format Column 1 as numeric 
      using (ExcelRange col = ws.Cells[2, 1, 2 + tbl.Rows.Count, 1]) 
      { 
        col.Style.Numberformat.Format = "#,##0.00"; 
        col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right; 
       } 

       //Write it back to the client 
       Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx"); 
       Response.BinaryWrite(pck.GetAsByteArray()); 
      } 
     } 
    } 
} 
関連する問題