Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - C# Экспорт DataGridView в Excel

Ответить
Настройки темы
.NET - C# Экспорт DataGridView в Excel

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Изменения
Автор: Delirium
Дата: 09-12-2012
Вложения
Тип файла: rar Экспорт данных.rar
(3.4 Kb, 525 просмотров)
Это не вопрос, а скорее в помощь программистам. Прилагаю код функции, осуществляющей выгрузку 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.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)

Это сообщение посчитали полезным следующие участники:

Отправлено: 06:05, 30-09-2011

 

В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Недавно как раз делал экспорт в 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 ( );
                                }
                        }

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

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:37, 30-09-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


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

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:43, 30-09-2011 | #3


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


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

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 08:20, 30-09-2011 | #4


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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.

Отправлено: 21:22, 16-04-2012 | #5


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


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

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:59, 17-04-2012 | #6


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:42, 09-06-2012 | #7


Новый участник


Сообщения: 19
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:00, 04-12-2012 | #8


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 20:51, 15-05-2015 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - C# Экспорт DataGridView в Excel

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - Помогите написать макрос в Excel, экспорт данных из Excel в Word. E.v.g Программирование и базы данных 7 03-05-2018 22:18
.NET - Обновление текущей строки DataGridView Delirium Программирование и базы данных 0 28-03-2011 04:55
.NET - DataGridView с Checkbox LilLoco Программирование и базы данных 6 15-10-2010 01:21
.NET - DataGridView и C# Efsey Программирование и базы данных 3 22-09-2010 07:21
VBA - DataGridView MuCTEP Программирование и базы данных 9 23-07-2008 13:52




 
Переход