Как вставить (привязать) DataTable к книге Excel (проект книги VS Excel 2010)

У меня есть WCF Service, который возвращает данные как тип DataTable. Я хочу вставить эти данные в книгу Excel в событии Workbook_Startup.

Как лучше всего это сделать?

(Проект рабочей книги 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();

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 ..? если нет, я могу опубликовать пример кода, и вы можете внести изменения, необходимые для вашего варианта использования, дайте мне знать   -  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

Существует открытая суровая библиотека под названием 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