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.
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.