Как да вмъкнете (свържете) DataTable към работна книга на Excel (проект за работна книга срещу Excel 2010)

Имам WCF Service, който връща данни като тип DataTable. Искам да вмъкна тези данни в работната книга на Excel в събитието Workbook_Startup.

Кой е най-добрият начин да го направите?

(VS .NET 3.5 Excel 2010 Workbook Project)


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();

person Andrey Morozov    schedule 16.02.2012    source източник
comment
Какъв код сте пробвали сами...? също каква е структурата на DataTable ..? това връща ли се в XML формат..? ако е така, моля, потвърдете, че по този начин бих могъл да ви предложа просто решение за това как да итерирате XML данните, върнати от уеб услугата.   -  person MethodMan    schedule 16.02.2012
comment
@DJKRAZE: Не използвам XML. Вижте промените в публикацията ми (добавих фрагмента на изходния код)   -  person Andrey Morozov    schedule 16.02.2012
comment
това, което трябва да направите, е да използвате Microsoft.Office.Interop.Excel запознати ли сте с Interop..? ако не, мога да публикувам примерен код и можете да направите необходимите промени, за да пасне на вашия UseCase, уведомете ме   -  person MethodMan    schedule 16.02.2012


Отговори (4)


Опитайте този пример, това трябва да е достатъчно, за да започнете в раздела за използване в горната част, добавете това

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

може също да се наложи да добавите препратката на ниво проект, както и да се уверите, че подреждате списъка, когато изберете препратка--> добавяне--> и изберете правилната версия на сглобката на Microsoft Office Interop въз основа на инсталираната версия, която имате

вероятно версия 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();
}
person MethodMan    schedule 16.02.2012
comment
Работният ми ден за днес приключи. Утре ще се опитам да направя нещо въз основа на вашия код/ Thx! - person Andrey Morozov; 16.02.2012
comment
Всичко беше супер! Благодаря ти! Беше по-лесно, отколкото си мислех! (Добавих окончателно решение като мой собствен отговор) - person Andrey Morozov; 17.02.2012
comment
Това е страхотно и се радвам, че успях да хвърля малко светлина върху това за вас.. +! на вас, че успяхте да намерите по-лесно решение, при което другите просто биха взели отговора, а не се опитаха да разберат как да преработят кода, който беше представен. - person MethodMan; 17.02.2012

Крайно решение:

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];
    }
}
person Andrey Morozov    schedule 17.02.2012
comment
Много време след като направихте това - чудех се дали върнатите данни се показват като чисти стойности в Excel, или са като функция за масив? Трябва ли да се тревожите много за типовете данни? - person n1k31t4; 29.08.2017
comment
Всъщност не мога да си спомня нищо нито за проблем, нито за решение... :) Съжалявам - person Andrey Morozov; 29.08.2017

Има отворена soure библиотека, наречена EPPlus, намерих един урок за това. Може да е полезно за вас.

DataTable към Excel

person C-Sharp    schedule 24.06.2012

Стар формат или библиотека с невалиден тип. (Изключение от HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

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