Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   C# Экспорт DataGridView в Excel (http://forum.oszone.net/showthread.php?t=216811)

Delirium 30-09-2011 06:05 1762817

C# Экспорт DataGridView в Excel
 
Вложений: 1
Это не вопрос, а скорее в помощь программистам. Прилагаю код функции, осуществляющей выгрузку DataGridView в Excel. Код предельно прост, можно из него сделать мааааленькую dll-ку и пользоваться в проектах.

Код:

public void ExportToExcel(DataGridView grid)
        {
            ApplicationClass Excel = new ApplicationClass();
            XlReferenceStyle RefStyle = Excel.ReferenceStyle;
            Excel.Visible = true;
            Workbook wb = null;
            String TemplatePath = System.Windows.Forms.Application.StartupPath + @"\Экспорт данных.xlt";
            try
            {
                wb = Excel.Workbooks.Add(TemplatePath); // !!!
            }
            catch (System.Exception ex)
            {
                throw new Exception("Не удалось загрузить шаблон для экспорта " + TemplatePath + "\n" + ex.Message);
            }
            Worksheet ws = wb.Worksheets.get_Item(1) as Worksheet;
            for (int j = 0; j < grid.Columns.Count; ++j)
            {
                (ws.Cells[1, j + 1] as Range).Value2 = grid.Columns[j].HeaderText;
                for (int i = 0; i < grid.Rows.Count; ++i)
                {
                    object Val = grid.Rows[i].Cells[j].Value;
                    if (Val != null)
                        (ws.Cells[i + 2, j + 1] as Range).Value2 = Val.ToString();
                }
            }
            ws.Columns.EntireColumn.AutoFit();
            Excel.ReferenceStyle = RefStyle;
            ReleaseExcel(Excel as Object);
        }

        private void ReleaseExcel(object excel)
        {
            // Уничтожение объекта Excel.
            Marshal.ReleaseComObject(excel);
            // Вызываем сборщик мусора для немедленной очистки памяти
            GC.GetTotalMemory(true);
        }

Для работы необходимо добавить зависимость(reference) на Microsoft.Office.Interop, а в коде программы дописать 3 строки:
Код:

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

И добавить в свой проект файл шаблона Экспорт данных.xlt, указав ему копироваться в выходной каталог при построении решения. Шаблон может быть любым, имя можно поменять в коде. На всякий случай, прилагаю свой шаблон.


Далее просто вызываем функцию ExportToExcel(dataGridView1);.
Вроде бы просто :)

Для большей надежности выгрузки можно вначале функции написать
Excel.Visible = false;
а в конце выгрузки
Excel.Visible = true;
Таким образом, сначала в фоновом режиме заполнятся данные, а уж потом отобразится окно Excel.

LilLoco 30-09-2011 07:37 1762838

Недавно как раз делал экспорт в excel, но воспользовался другим методом:

читать дальше »

Код:

string filename = "имя файла.xls"; // путь файла
System.IO.File.Copy("1.xls", filename, true); // копируем файл, шаблон файла должен лежать рядом с *.exe (1.xls)
string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + fileName + "';Extended Properties=Excel 8.0;"; // строка подключения
                        using (OleDbConnection ole = new OleDbConnection ( connectionString )) // используем OleDb
                        {
                                try
                                {
                                        ole.Open ( );
                                        for (int i = 0; i < gridViewShow.Rows.Count; i++)
                                        {
                                                var cmd = new OleDbCommand ( "INSERT INTO [Лист1$] VALUES ('" + gridViewShow.Rows[i].Cells[1].Value + "','" + gridViewShow.Rows[i].Cells[3].Value + "','" + gridViewShow.Rows[i].Cells[2].Value + "','" + gridViewShow.Rows[i].Cells[4].Value + "','" + gridViewShow.Rows[i].Cells[5].Value + "',' ')", ole );
                                                cmd.ExecuteNonQuery ( ); // вставляем данные в лист1 файла - filename
                                                cmd.Dispose ( );
                                        }
                                }
                                finally
                                {
                                        ole.Close ( );
                                }
                        }


Получилось все вроде бы хорошо =) Экспортирует!

Delirium 30-09-2011 07:43 1762841

Тоже неплохо :)
Разница в том, что твой код формирует файл в фоновом режиме и через ole провайдера.
Мой код сначала активирует окно Excel и в визуальном режиме отображает заполнение. Это имеет свои недостатки - нежелательно прокручивать листы во время работы, иначе будет исключение доступа.
А в целом можно использовать оба способа, кому как удобно.
В моем случае можно избавиться от вечных приколов Excel, когда строку типа 01.06 он выводит в виде 1 июн - надо в шаблоне выставить тип нужного столбца в текстовый.

LilLoco 30-09-2011 08:20 1762851

Цитата:

Цитата Delirium
можно избавиться от вечных приколов Excel, когда строку типа 01.06 он выводит в виде 1 июн - надо в шаблоне выставить тип нужного столбца в текстовый. »

Спасибо за разъяснение :)
Таких полей у меня не было, поэтому не столкнулся с этим и не знал...

Gever_Lances@fb 16-04-2012 21:22 1900973

check the following link that explain how to export datagridview to excel - c# full source code

http://vb.net-informations.com/excel...w_to_excel.htm

lee.

Delirium 17-04-2012 00:59 1901068

Gever_Lances@fb, и что? Приведенный тобой код немногим отличается от нашего. Или просто до копилки?

cybertron 09-06-2012 17:42 1931343

Спасибо автору!!!

hhh8484 04-12-2012 16:00 2038557

Спасибо автору лишь хочу добавить где можно скачать dll Microsoft.Office.Interop
Office XP
Office 2003
Office 2007
Office 2010

Alternativa22 15-05-2015 20:51 2507845

А у меня Visual Studio 2010 ругается на ApplicationClass, что делать? Кучу сайтов перерыла,ответа не нашла(


Время: 19:50.

Время: 19:50.
© OSzone.net 2001-