Преобразование datatable в excel 2007 (.xlsx)

У меня есть DataTable Мне нужно поместить в формат Excel 2007 и сохранить его как файл excel (.xlsx) 2007.

Может ли кто-нибудь помочь мне достичь этого?

Ответ 1

Вы можете использовать поставщика данных OLEDB и просто обрабатывать Excel как другой источник данных ADO.NET, чтобы перебирать строки DataTable и вставлять их в электронную таблицу Excel. Вот статья Microsoft KB, в которой вы найдете много деталей.

http://support.microsoft.com/kb/316934/en-us

Самое главное иметь в виду, что вы можете создавать книги и листы в книге, и вы можете ссылаться на существующие листы, добавляя "$" в конце имени. Если вы опустите "$" в конце имени листа, поставщик OLEDB предположит, что это новый лист и попытается его создать.

Знак доллара после имя рабочего листа является признаком того, что таблица существует. Если вы создаете новую таблицу, как описано в Создание новых книг и таблиц раздел этой статьи, не используйте знак доллара.

Вы можете создать и электронную таблицу в формате 2003 (.xls) или 2007 (xlsx) и указать в строке соединения - указать файл, который вы собираетесь писать, и просто указать расширение. Убедитесь, что вы используете правильную версию поставщика OLEDB.

Если вы хотите создать версию 2003 (.xls), вы используете эту строку подключения:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES

Если вы хотите создать версию 2007 (.xlsx), вы используете эту строку подключения:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xlsx;Extended Properties="Excel 12.0;HDR=YES

Возможно, вам придется загрузить поставщик ACE из Microsoft для создания файлов XLSX. Вы можете найти здесь здесь.

Я обычно использую поставщика XLS, поэтому я не работал с провайдером XLSX столько же.

Надеюсь, это поможет. Дайте мне знать, если у вас есть другие вопросы.

Ответ 2

Я написал следующий код для компании некоторое время назад. Он берет Enumerable любого типа класса и экспортирует все его свойства (get) в Excel, а также открывает Excel. Вы должны иметь возможность сделать что-то подобное для DataTable. Помните, что вам нужно добавить ссылку на Microsoft.Office.Interop.Excel

    public static void ExportToExcel<T>(IEnumerable<T> exportData)
    {
        Excel.ApplicationClass excel = new Excel.ApplicationClass();
        Excel.Workbook workbook = excel.Application.Workbooks.Add(true);
        PropertyInfo[] pInfos = typeof(T).GetProperties();
        if (pInfos != null && pInfos.Count() > 0)
        {
            int iCol = 0;
            int iRow = 0;
            foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
            {
                // Add column headings...
                iCol++;
                excel.Cells[1, iCol] = eachPInfo.Name;
            }
            foreach (T item in exportData)
            {
                iRow++;
                // add each row cell data...
                iCol = 0;
                foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
                {
                    iCol++;
                    excel.Cells[iRow + 1, iCol] = eachPInfo.GetValue(item, null);
                }

            }
            // Global missing reference for objects we are not defining...
            object missing = System.Reflection.Missing.Value;
            // If wanting to Save the workbook...   
            string filePath = System.IO.Path.GetTempPath() + DateTime.Now.Ticks.ToString() + ".xlsm";
            workbook.SaveAs(filePath, Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, 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.Rows.EntireRow.AutoFit();
            excel.Columns.EntireColumn.AutoFit();
            ((Excel._Worksheet)worksheet).Activate();
        }
    }

Ответ 3

У меня есть DataTable, который мне нужно вставить в формат Excel 2007 и сохранить его как файл excel (.xlsx) 2007.

Может ли кто-нибудь помочь мне достичь этого?

Вам просто нужно добавить мой бесплатный класс С# в ваш проект и одну строку кода.

Полная информация (с бесплатным загружаемым исходным кодом и примерным проектом) здесь:

База знаний Mikes - Экспорт в Excel

Моя библиотека использует бесплатные библиотеки Microsoft OpenXML (также предусмотренные в моих загрузках) для записи файла, поэтому вам не нужно использовать суперкомпьютерные библиотеки VSTO или установить Excel на ваш сервер.

Кроме того, он создает реальный .xlsx файл, а не некоторые другие методы, которые записывают поток данных в текстовый файл, разделенный запятыми, но назовите его как .xls файл.

Кстати, у меня было много трудностей с написанием файлов Excel с помощью OLEDB, не в последнюю очередь потому, что я запускал 64-разрядную версию Windows 7 с Office 2007 (32-разрядной), а поставщик Microsoft ACE должен быть 64-разрядная версия... но вы не можете установить это, если у вас установлена ​​32-разрядная версия Office.

Итак, вам нужно удалить Office, установить драйвер ACE, а затем снова установить Office.
Но даже тогда я отказался от использования OLEDB.. он просто не был достаточно стабильным.

Ответ 4

Нашел это в каком-то старом кодексе, который мне понравился 5 лет назад, который должен работать...

public static void DataTableToExcel(DataTable tbl)
{
    HttpContext context = HttpContext.Current;
    context.Response.Clear();
    foreach (DataColumn c in tbl.Columns)
    {
        context.Response.Write(c.ColumnName + ";");
    }
    context.Response.Write(Environment.NewLine);
    foreach (DataRow r in tbl.Rows)
    {
        for (int i = 0; i < tbl.Columns.Count; i++)
        {
            context.Response.Write(r[i].ToString().Replace(";", string.Empty) + ";");
        }
        context.Response.Write(Environment.NewLine);
    }
    context.Response.ContentType = "text/csv";
    context.Response.AppendHeader("Content-Disposition",
        "attachment; filename=export.csv");
    context.Response.End();
}

Это выведет из ASP.NET ответ с файлом CSV, который может открыть Excel 2007. Если вы хотите, вы можете изменить расширение, чтобы имитировать excel, и оно должно работать только путем замены следующих строк:

    context.Response.ContentType = "application/vnd.ms-excel";
    context.Response.AppendHeader("Content-Disposition",
        "attachment; filename=export.xlsx");

CSV - это самый простой способ, если вам не нужно ничего делать сложным. Если вам действительно нужен файл Excel 2007 в собственном формате, вам нужно будет использовать библиотеку Office для ее создания или преобразования из CSV, а затем выполнить его/сохранить.

Эта ссылка также может быть полезна:

Как избежать окна подсказки Excel при экспорте данных в Excel 2007

Ответ 5

вам нужно будет сделать много interop, вот учебник, надеюсь, что это поможет. текст ссылки

Ответ 6

Видел, что кто-то еще разместил опцию "сохранить в csv". Хотя это не похоже на то, что искали OP, вот моя версия, которая включает заголовки таблиц.

    public static String ToCsv(DataTable dt, bool addHeaders)
    {
        var sb = new StringBuilder();
        //Add Header Header
        if (addHeaders)
        {
            for (var x = 0; x < dt.Columns.Count; x++)
            {
                if (x != 0) sb.Append(",");
                sb.Append(dt.Columns[x].ColumnName);
            }
            sb.AppendLine();
        }
        //Add Rows
        foreach (DataRow row in dt.Rows)
        {
            for (var x = 0; x < dt.Columns.Count; x++)
            {
                if (x != 0) sb.Append(",");
                sb.Append(row[dt.Columns[x]]);
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }