Конвертировать данные в Excel 2007 (.xlsx) - PullRequest
10 голосов
/ 19 июля 2010

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

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

Ответы [ 6 ]

8 голосов
/ 19 июля 2010

Вы можете использовать поставщик данных 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.

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

3 голосов
/ 29 июля 2010

Некоторое время назад я написал следующий код для компании. Он принимает 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's 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();
        }
    }
2 голосов
/ 01 февраля 2013

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

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

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

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

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

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

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

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

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

1 голос
/ 19 июля 2010

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

0 голосов
/ 30 апреля 2015

Увидел, что кто-то еще опубликовал опцию "сохранить в CSV". Хотя это и не казалось ответом, который ищет ОП, вот моя версия, которая включает заголовки таблицы

    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();
    }
0 голосов
/ 19 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...