Codeby web-security - новый курс от Codeby Security School

Представляем вашему вниманию новый курс от команды The Codeby - "Тестирование Веб-Приложений на проникновение с нуля". Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое. Подробнее ...


Как выполнить экспорт данных из DataGridView в Excel файл?

В этой статье хочу показать на простом примере, как с помощью языка c# можно выполнить экспорт данных из DataGridView в Excel файл.

И так для начала создадим Windows Forms приложение на языке csharp, после чего добавим на форму два элемента управления: DataGridView (dgv) и кнопку с надписью: Экспорт в Excel.

Windows Forms Application

Подготовка

И так для начала создадим метод CreateTable.

private DataTable CreateTable()
{
//создаём таблицу
DataTable dt = new DataTable("Friends");
//создаём три колонки
DataColumn colID = new DataColumn("ID", typeof(Int32));
DataColumn colName = new DataColumn("Name", typeof(String));
DataColumn colAge = new DataColumn("Age", typeof(Int32));
//добавляем колонки в таблицу
dt.Columns.Add(colID);
dt.Columns.Add(colName);
dt.Columns.Add(colAge);
DataRow row = null;
//создаём новую строку
row = dt.NewRow();
//заполняем строку значениями
row["ID"] = 1;
row["Name"] = "Vanya";
row["Age"] = 45;
//добавляем строку в таблицу
dt.Rows.Add(row);
//создаём ещё одну запись в таблице
row = dt.NewRow();
row["ID"] = 2;
row["Name"] = "Vasya";
row["Age"] = 35;
dt.Rows.Add(row);
return dt;
}

С помощью данного метода мы создадим таблицу с данными, которые затем, например, в событие Form.Load, загрузим в элемент управления DataGridView.

private void Form1_Load(object sender, EventArgs e)
{
dgv.DataSource = CreateTable();
}

Нажимаем F5 или Ctrl+F5 и получаем следующий результат.

control DataGridView

Экспорт в Excel

Первый этап закончен. Теперь переходим ко второму этапу, который так же начнётся с создания метода. И так, для начала создадим метод ExportToExcel. С помощью него, как думаю не трудно догадаться, мы собственно и будем выполнять экспорт данных в Excel файл.

private void ExportToExcel()
{
}

Для работы с Excel нам понадобиться добавить в проект сборку: Microsoft.Office.Interop.Excel.

Add references

подключение сборки

Чтобы каждый раз не обращаться к членам и типам данной сборки, используя полные имена, добавим следующую строку:

using Microsoft.Office.Interop.Excel;

Если сейчас Вы обратите своё внимание на написанный ранее код, то заметите, что в методе CreateTable имя класса DataTable почему-то стало подчеркнутым или выделенным красным цветом. Это произошло, потому что класс DataTable, присутствует как в пространстве имён Microsoft.Office.Interop.Excel так и в пространстве имён System.Data, в результате чего возник конфликт имён.

Чтобы разрешить возникший конфликт создадим псевдоним для пространства имён System.Data

//псевдоним
using SD = System.Data;

псевдоним

После чего в исходном коде перед именем класса DataTable укажем имя псевдонима.

private SD.DataTable CreateTable()
{
SD.DataTable dt = new SD.DataTable("Friends");
...
}

Конфликта больше нет и теперь можно работать дальше.

И так, чтобы выполнить экспорт данных в excel файл нам понадобиться для начала создать объект класса Application. Здесь так же возникает конфликт имен, поэтому в данном примере я создам ещё один псевдоним, но Вы можете просто указать полное имя:

using Excel = Microsoft.Office.Interop.Excel;

Затем внутри метода ExportToExcel создадим новый объект.


Paranoid - курс от Codeby Security School

Представляем вашему вниманию курс от команды codeby - "Комплекс мер по защите персональных данных, анонимности в интернете и не только" Подробнее ...


Excel.Application exApp = new Excel.Application();

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

exApp.Visible = true; (данную строку можно не указывать)

Затем создадим одну новую рабочую книгу.

exApp.Workbooks.Add();

Excel рабочая книга

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

Worksheet workSheet = (Worksheet)exApp.ActiveSheet;

В первой строке листа мы поместим названия колонок.

workSheet.Cells[1, 1] = "ID";
workSheet.Cells[1, "B"] = "Name";
workSheet.Cells[1, 3] = "Age";

колонки

Первая цифра это номер строки, вторая ячейки. Вместо цифры Вы можете указывать и буквенное обозначение.

Экспортируем данные из DataGridView в Excel файл.

int rowExcel = 2; //начать со второй строки.
for (int i = 0; i < dgv.Rows.Count; i++)
{
//заполняем строку
 workSheet.Cells[rowExcel, "A"] = dgv.Rows[i].Cells["ID"].Value;
 workSheet.Cells[rowExcel, "B"] = dgv.Rows[i].Cells["Name"].Value;
workSheet.Cells[rowExcel, "C"] = dgv.Rows[i].Cells["Age"].Value;
++rowExcel;
}

Сохраняем результат в Excel файл.

string pathToXmlFile;
pathToXmlFile = Environment.CurrentDirectory + "\\" + "MyFile.xls";
workSheet.SaveAs(pathToXmlFile);

В данном примере файл будет создан в папке Debug текущего проекта.

Excel файл

И в конце завершаем работу с Microsoft Excel.

exApp.Quit();

Нам осталось выполнить последний шаг. В событие Button.Click поместим метод ExportToExcel.

private void button1_Click(object sender, EventArgs e)
{
ExportToExcel();
}

На этом экспорт завершен, окончательный результат можно увидеть на картинке ниже.

результат

Полный листинг:

private void ExportToExcel()
{
Excel.Application exApp = new Excel.Application();
exApp.Visible = true;
exApp.Workbooks.Add();
Worksheet workSheet = (Worksheet)exApp.ActiveSheet;
workSheet.Cells[1, 1] = "ID";
workSheet.Cells[1, 2] = "Name";
workSheet.Cells[1, 3] = "Age";
int rowExcel = 2;
for (int i = 0; i < dgv.Rows.Count; i++)
{
workSheet.Cells[rowExcel, "A"] = dgv.Rows[i].Cells["ID"].Value;
 workSheet.Cells[rowExcel, "B"] = dgv.Rows[i].Cells["Name"].Value;
workSheet.Cells[rowExcel, "C"] = dgv.Rows[i].Cells["Age"].Value;
++rowExcel;
}
workSheet.SaveAs("MyFile.xls");
exApp.Quit();
}

Если Вам нужно вывести данные не из DataGridView, а из DataTable то это, например можно сделать следующим образом:

//было
workSheet.Cells[rowExcel, "A"] = dgv.Rows[i].Cells["ID"].Value;
//стало
workSheet.Cells[rowExcel, "A"] = dt.Rows[i].Field<int>("ID");

На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.

Дополнение:

1. Свойство Visible влияет на быстродействие, поэтому перед выполнением цикла его лучше установить в значение false.

Excel.Application exApp = new Excel.Application();
exApp.Visible = false;
for()
{
}
exApp.Visible = true;

2. Большой объём данных можно быстро экспортировать, например, с помощью следующего способа:

//сохраняем данные из таблицы в xml файл
DataTable dt = new DataTable("Cars");
dt.WriteXml(pathToXmlFile);
//экспорт
Excel.Application exApp = new Excel.Application();
Excel.Workbook workbook = exApp.Workbooks.OpenXML(pathToXmlFile, Type.Missing, LoadOption.PreserveChanges);

В данном примере xml схема не используется (второй параметр), поэтому возможно появится сообщение: Указанный источник XML не ссылается на схему просто нажимаем кнопку OK.

Читайте также:


Codeby Market от Сodeby

Мы запустили свой магазин CodebyMarket Equipment for InfoSec. Уже добавили RaspberryAlfa Long-RangeOrange PiArduino и многое другое. Купить Pentesting Devices