2012-02-16 148 views
0

我有WCF Service,返回數據爲DataTable類型。我想將這些數據插入到Workbook_Startup事件中的Excel工作簿中。如何插入(綁定)DataTable到Excel工作簿(VS Excel 2010工作簿項目)

這樣做的最佳方法是什麼?

(VS .NET 3.5的Excel 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 2012-02-16 15:01:11

+0

@DJKRAZE:我不使用XML。查看我的文章中的更改(我添加了源代碼片段) – 2012-02-16 15:28:22

+0

ok我會看看謝謝 – MethodMan 2012-02-16 15:31:32

回答

4

嘗試這個例子中這應該足以讓你開始 在頂部使用中添加該

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

你可能還需要增加在項目級的參考以及 確保當您選擇參考訂購列表 - >新增 - >和選擇基於安裝的版本正確版本的Microsoft Office互操作程序集的你有

版本大概12或14,我猜..

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做些事情! – 2012-02-16 15:48:03

+0

一切都很棒!謝謝!這比我想象的要容易! (我添加了最終的解決方案作爲我自己的答案) – 2012-02-17 13:47:00

+0

這真棒,我很高興我能夠爲你揭開一些光明。你能夠找出一個更容易的解決方案,其他人只會採取答案,而不是試圖瞭解如何重構所呈現的代碼。 – MethodMan 2012-02-17 13:51:54

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中顯示爲純數值,還是像數組函數?你需要擔心數據類型嗎? – 2017-08-29 12:25:35

+0

其實我都記不起任何關於問題和解決方法的東西...... :)對不起 – 2017-08-29 14:18:42

0

舊格式或無效類型庫。 (異常來自HRESULT:0x80028018(TYPE_E_INVDATAREAD))

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

有一個叫EPPlus一個開放的索裏圖書館,我發現了一個教程。它可能對你有幫助。

DataTable to Excel