2012-02-16 145 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