Войти

Показать полную графическую версию : C# Экспорт DataGridView в Excel


Delirium
30-09-2011, 06:05
Это не вопрос, а скорее в помощь программистам. Прилагаю код функции, осуществляющей выгрузку 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
Недавно как раз делал экспорт в 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
Тоже неплохо :)
Разница в том, что твой код формирует файл в фоновом режиме и через ole провайдера.
Мой код сначала активирует окно Excel и в визуальном режиме отображает заполнение. Это имеет свои недостатки - нежелательно прокручивать листы во время работы, иначе будет исключение доступа.
А в целом можно использовать оба способа, кому как удобно.
В моем случае можно избавиться от вечных приколов Excel, когда строку типа 01.06 он выводит в виде 1 июн - надо в шаблоне выставить тип нужного столбца в текстовый.

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

Gever_Lances@fb
16-04-2012, 21:22
check the following link that explain how to export datagridview to excel - c# full source code

http://vb.net-informations.com/excel-2007/vb.net_export_from_datagridview_to_excel.htm

lee.

Delirium
17-04-2012, 00:59
Gever_Lances@fb, и что? Приведенный тобой код немногим отличается от нашего. Или просто до копилки?

cybertron
09-06-2012, 17:42
Спасибо автору!!!

hhh8484
04-12-2012, 16:00
Спасибо автору лишь хочу добавить где можно скачать dll Microsoft.Office.Interop
Office XP (http://www.microsoft.com/en-us/download/details.aspx?id=227)
Office 2003 (http://www.microsoft.com/en-us/download/details.aspx?id=20923)
Office 2007 (http://www.microsoft.com/en-us/download/details.aspx?id=18346)
Office 2010 (http://www.microsoft.com/en-us/download/details.aspx?id=3508)

Alternativa22
15-05-2015, 20:51
А у меня Visual Studio 2010 ругается на ApplicationClass, что делать? Кучу сайтов перерыла,ответа не нашла(




© OSzone.net 2001-2012