2012-02-16 18 views
0

DataTableタイプのデータを返すWCF Serviceがあります。このデータをWorkbook_StartupイベントのExcelワークブックに挿入します。Excelブック(VS Excel 2010ブックプロジェクト)にDataTableを挿入(バインド)する方法

どのような方法が最適ですか?

(VS .NET 3.5エクセル2010ワークブックプロジェクト)


WCFサービスコード:

public DataTable GetQuarterTargetAchievement() 
{ 
    var dt = new DataTable("TargetAchievement"); 

    using (var conn = new SqlConnection(GetConnectionString())) 
    { 
     using (var da = new SqlDataAdapter("SELECT fld1, fld2, ... , fldN FROM dbo.ReportTable; ", conn)) 
     { 
      da.Fill(dt); 
     } 
    } 

    return dt; 
} 

クライアントコード:

var dt = proxy.GetQuarterTargetAchievement(); 
+0

自分で試したコードは何ですか?また、DataTableの構造は何ですか?これはXML形式で返されますか?もしそうなら、その方法を確認して、Webサービスが返すXMLデータを反復する簡単な方法を提供することができます。 – MethodMan

+0

@DJKRAZE:私はXMLを使用しません。私のポストの変更を参照してください(私はソースコードスニペットを追加しました) –

+0

okありがとうございます – MethodMan

答えて

4

これがすべきこの例を試してみてくださいあなたを始めるのに十分である上部にあなたの使用してセクションにこれは

using Microsoft.Office.Interop.Excel; 
using System.Runtime.InteropServices; 

あなたも あなたがリファレンスを選択したときに、あなたがリストを注文してくださいだけでなく、プロジェクトレベルでの参照を追加する必要があります追加 - >追加 - >と私は推測していますおそらく12か14のverあなたが

を持ってインストールしたバージョンに基づいて、Microsoft Officeの相互運用機能アセンブリの正しいバージョンを選択します。..

private static void Excel_FromDataTable(DataTable dt) 
{ 
    // Create an Excel object and add workbook... 
    Excel.ApplicationClass excel = new Excel.ApplicationClass(); 
    Excel.Workbook workbook = excel.Application.Workbooks.Add(true); // true for object template??? 

    // Add column headings... 
    int iCol = 0; 
    foreach (DataColumn c in dt.Columns) 
    { 
     iCol++; 
     excel.Cells[1, iCol] = c.ColumnName; 
    } 
    // for each row of data... 
    int iRow = 0; 
    foreach (DataRow r in dt.Rows) 
    { 
     iRow++; 

     // add each row's cell data... 
     iCol = 0; 
     foreach (DataColumn c in dt.Columns) 
     { 
      iCol++; 
      excel.Cells[iRow + 1, iCol] = r[c.ColumnName]; 
     } 
    } 

    // Global missing reference for objects we are not defining... 
    object missing = System.Reflection.Missing.Value; 

    // If wanting to Save the workbook... 
    workbook.SaveAs("MyExcelWorkBook.xls", 
    Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing, 
    false, false, Excel.XlSaveAsAccessMode.xlNoChange, 
    missing, missing, missing, missing, missing); 

    // If wanting to make Excel visible and activate the worksheet... 
    excel.Visible = true; 
    Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet; 
    ((Excel._Worksheet)worksheet).Activate(); 

    // If wanting excel to shutdown... 
    ((Excel._Application)excel).Quit(); 
} 
+0

今日は私の仕事日が過ぎています。明日私はあなたのコード/ Thxに基づいて何かをしようとします! –

+0

すべてが素晴らしかったです!ありがとうございました!思ったよりも簡単でした! (私は自分の答えとして最終的な解決策を追加しました) –

+0

これはすばらしいことですが、私はあなたのためにそれに光を当てることができたことをうれしく思います。他の人がちょうど答えを出し、提示されたコードをどのようにリファクタリングするのか理解しようとしなかった方が簡単な解決策を見つけ出すことができるのです。 – MethodMan

2

最終的な解決策:

var dt = proxy.GetQuarterTargetAchievement(); 

int 
    column = 0, 
    row = 0; 

foreach (DataColumn col in dt.Columns) 
{ 
    this.Application.Cells[1, ++column] = col.ColumnName; 
} 

foreach (DataRow r in dt.Rows) 
{ 
    row++; 
    column = 0; 
    foreach (DataColumn c in dt.Columns) 
    { 
     this.Application.Cells[row + 1, ++column] = r[c.ColumnName]; 
    } 
} 
+0

あなたがこれをしてからずっと後で - Excelで純粋な値として表示されるか、配列関数に似ていますか?あなたは多くのデータ型について心配する必要がありますか? –

+0

実際に私は問題も解決策も何も覚えていません... :)申し訳ありません –

0

古い形式または無効なタイプライブラリ。 (HRESULTからの例外:0x80028018(TYPE_E_INVDATAREAD))

Microsoft.Office.Interop.Excel.Workbook workbook = 
    excel.Application.Workbooks.Add(true); // true for object template??? 
0

EPPlusと呼ばれるオープンsoureライブラリがあり、私はその上の1つのチュートリアルを見つけました。それはあなたの役に立つかもしれません。

DataTable to Excel

関連する問題