• 4 июля стартует курс «Python для Пентестера ©» от команды The Codeby

    Понятные и наглядные учебные материалы с информацией для выполнения ДЗ; Проверка ДЗ вручную – наставник поможет улучшить написанный вами код; Помощь преподавателей при выполнении заданий или в изучении теории; Групповой чат в Telegram с другими учениками, проходящими курс; Опытные разработчики – команда Codeby School, лидер по информационной безопасности в RU-сегменте

    Запись на курс до 15 июля. Подробнее ...

  • 11 июля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 20 июля. Подробнее ...

Статья C# Экспорт данных из DataGridView в Excel файл

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

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

29831


Подготовка
И так для начала создадим метод CreateTable.
C#:
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.
C#:
private void Form1_Load(object sender, EventArgs e)
{
dgv.DataSource = CreateTable();
}
Нажимаем F5 или Ctrl+F5 и получаем следующий результат.

29832



Экспорт в Excel
Первый этап закончен. Теперь переходим ко второму этапу, который так же начнётся с создания метода. И так, для начала создадим метод ExportToExcel. С помощью него, как думаю не трудно догадаться, мы собственно и будем выполнять экспорт данных в Excel файл.
C#:
private void ExportToExcel()
{
}
Для работы с Excel нам понадобиться добавить в проект сборку: Microsoft.Office.Interop.Excel.

29833


29834


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

Чтобы разрешить возникший конфликт создадим псевдоним для пространства имён System.Data
C#:
//псевдоним
using SD = System.Data;
29835


После чего в исходном коде перед именем класса DataTable укажем имя псевдонима.
C#:
private SD.DataTable CreateTable()
{
SD.DataTable dt = new SD.DataTable("Friends");
...
}
Конфликта больше нет и теперь можно работать дальше.

И так, чтобы выполнить экспорт данных в excel файл нам понадобиться для начала создать объект класса Application. Здесь так же возникает конфликт имен, поэтому в данном примере я создам ещё один псевдоним, но Вы можете просто указать полное имя:
C#:
using Excel = Microsoft.Office.Interop.Excel;
Затем внутри метода ExportToExcel создадим новый объект.
C#:
Excel.Application exApp = new Excel.Application();
Следующая строка используется для отладки, чтобы мы могли отслеживать результаты в ходе выполнения кода.
C#:
exApp.Visible = true; (данную строку можно не указывать)
Затем создадим одну новую рабочую книгу.
Код:
exApp.Workbooks.Add();
29836


Созданная книга по умолчанию содержит три листа, поэтому добавлять их в данном примере не требуется. Поэтому сразу же получаем активный лист.
C#:
Worksheet workSheet = (Worksheet)exApp.ActiveSheet;
В первой строке листа мы поместим названия колонок.
C#:
workSheet.Cells[1, 1] = "ID";
workSheet.Cells[1, "B"] = "Name";
workSheet.Cells[1, 3] = "Age";
29837


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

Экспортируем данные из DataGridView в Excel файл.
C#:
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 файл.
C#:
string pathToXmlFile;
pathToXmlFile = Environment.CurrentDirectory + "\\" + "MyFile.xls";
workSheet.SaveAs(pathToXmlFile);
В данном примере файл будет создан в папке Debug текущего проекта.

29838


И в конце завершаем работу с Microsoft Excel.
C#:
exApp.Quit();
Нам осталось выполнить последний шаг. В событие Button.Click поместим метод ExportToExcel.
C#:
private void button1_Click(object sender, EventArgs e)
{
ExportToExcel();
}
На этом экспорт завершен, окончательный результат можно увидеть на картинке ниже.

29839


Полный листинг:
C#:
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 то это, например можно сделать следующим образом:
C#:
//было
workSheet.Cells[rowExcel, "A"] = dgv.Rows[i].Cells["ID"].Value;
//стало
workSheet.Cells[rowExcel, "A"] = dt.Rows[i].Field<int>("ID");
На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.

Дополнение:
1. Свойство Visible влияет на быстродействие, поэтому перед выполнением цикла его лучше установить в значение false.
C#:
Excel.Application exApp = new Excel.Application();
exApp.Visible = false;
for()
{
}
exApp.Visible = true;
2. Большой объём данных можно быстро экспортировать, например, с помощью следующего способа:
C#:
//сохраняем данные из таблицы в 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.

Читайте также:
 
  • Нравится
Реакции: Unison

The Codeby

ООО Кодебай
30.12.2015
4 616
6 636
АЛЕКСАНДР
01.09.2015 в 03:37
как ни пытался ни получается на моем примере, возможна связь с вами чтобы показать свой пример?

ADMIN
02.09.2015 в 07:16
Что конкретно не получается?

АЛЕКСАНДР
03.09.2015 в 00:30
у меня была база на access и там была кнопка экспорта, работала она отлично , сейчас делаю похожую прогу с подключением к mysql бд , и было много ошибок, благодаря вашему примеру я все сделал ошибки не выскальзывают , но если запросить данные в datagridview то экпорт не случается но страничку excel открывает, я уже все что можно испробовал...

ADMIN
03.09.2015 в 16:59
Код отвечающий за экспорт изменяли? Если да, то добавьте его в комментарий.

АЛЕКСАНДР
05.09.2015 в 02:13
я уже сам разобрался), но у меня новый вопрос, мне нужны сделать поле поиска в таблице?

АЛЕКСАНДР
05.09.2015 в 23:39
блин нет, не разобрался, в той форме где datagridview получает данные с таблицы которая имеет связь со всеми таблицами никак не хочет работать, остальные работают почти так как и нужно

ADMIN
07.09.2015 в 09:00
Не понял: «сделать поле поиска в таблице?»… поиск в dataGridView или БД?

АЛЕКСАНДР
08.09.2015 в 08:58
да, блин может все поможешь с экспортом из бд? может быть беда в том, что таблица MyISAM? все остальные нормально экпортируются, а эта никак ваще не хочет...

ADMIN
08.09.2015 в 21:41
«никак ваще не хочет» — ; что значит? Появляются какие-то ошибки или что происходит?
Схема: БД -> DataTable -> DatagridView -> Excel файл?

АЛЕКСАНДР
09.09.2015 в 23:53
у меня 5 разных форм с подключением к таблиц, 4 из них работают так как мне и нужно, 5-ая никак не хочет, хотя там код тот же самый и на других формах он работает а на этой ошибки.
Необработанное исключение типа «System.ArgumentException» в mscorlib.dll
Дополнительные сведения: Сигнатура типа метода не совместима с Interop.

ADMIN
10.09.2015 в 11:42
Нужно убрать блоки try catch, если они конечно есть и посмотреть, где во время выполнения программы возникает исключение. И уже разбираться дальше, может быть там null, может быть там преобразование типов нельзя выполнить, причин может быть масса.
System.ArgumentException — "исключение выбрасывается, если один из передаваемых методу аргументов является недопустимым".
Как выглядит метод (сигнатура)? Что он должен принять (вход. параметры), и что он получает во время выполнения? Как выглядит строка, на которой происходит выброс исключения?

АЛЕКСАНДР
11.09.2015 в 19:05
Код:
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.Application.Workbooks.Add(Type.Missing);
ExcelApp.Columns.ColumnWidth = 20;
ExcelApp.Cells[1, 2] = "№п";
ExcelApp.Cells[1, 3] = "Пациент";
ExcelApp.Cells[1, 4] = "Врач";
ExcelApp.Cells[1, 5] = "Дата приема";
ExcelApp.Cells[1, 6] = "Время";
ExcelApp.Cells[1, 7] = "Услуга";
ExcelApp.Cells[1, 8] = "стоимость";
for (int j = 2; j <= dataGridView1.Rows.Count; j++)
{
for (int i = 2; i <= 7; i++)
{
ExcelApp.Cells[j, i] = dataGridView1.Rows[j - 2].Cells[i - 2].Value;
}
}
ExcelApp.Visible = true;

АЛЕКСАНДР
12.09.2015 в 23:18
try и catch есть только в подключении к бд. а программа ссылается на строку
Код:
ExcelApp.Cells[j, i] = dataGridView1.Rows[j - 2].Cells[i - 2].Value;

ADMIN
14.09.2015 в 04:41
Код:
for (int i = 2; i < = 7; i++)
– здесь точно 7, а не 8?
Выбрасывает исключение "System.ArgumentException"?

АЛЕКСАНДР
15.09.2015 в 04:12
да точно 7 должно быть, так как 7 столбцов и второй ответ тоже да, я не могу понять что не так то...

ADMIN
15.09.2015 в 22:34
7 столбцов в DatagridView — это да, но почему тогда в цикле обход начинается с ячейки (2,2), в которую записывается значение первого столбца DataGridView? В таком случаи «Стоимость» уже не выводится, потому что последнее значение ячейки, которое будет взято из строки в dgv, будет равно (0, 5), а не (0,6).
Код:
for (int j = 2; j < = dataGridView1.Rows.Count; j++)
{
for (int i=2; i
Dgv:
0 1 2 3 4 5 [6("Стоимость")] Count = 7
Excel:
2.1 (пропускаем) 2.2 (dgv.Rows[0].Cells[0]) 2.3(dgv[0][1]) Count=8

АЛЕКСАНДР
16.09.2015 в 20:11
я знал это, и делал так в других формах у себя чтобы где то код пациента не высвечивался (он не нужен) в данном примере дело не в количестве значений, он бы без определенных столбцов экспортировал, я если честно ваще не понимаю уже что ему не нравиться...

АЛЕКСАНДР
17.09.2015 в 18:24
вместо 7 поставил 8 и ничего не изменилось...

ADMIN
18.09.2015 в 23:47
У меня твой код экспорта работает без ошибок. Единственная проблема была только в том, что не заполнялась последняя ячейка в Excel файле.

АЛЕКСАНДР
19.09.2015 в 15:07
я нашел в чем причина, ввел блоки try и catch перед строкой с ошибкой, в общем он не может переместить столбец с временем, столбец имеет тип time, теперь он у меня все строки перекидывает а столбец со временем пустые... можешь подсказать почему он время не перекидывает в excel?

ADMIN
21.09.2015 в 06:23
Как выглядит значение в колонке time (формат какой)?

АЛЕКСАНДР
22.09.2015 в 08:32
00:00:00

АЛЕКСАНДР
22.09.2015 в 22:06
можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают,
Код:
string queryString = @"SELECT id_priema AS '№П', pacient.FIO AS 'Пациент', vrach.fio_vrach AS 'Врач',data_priema AS 'Дата', vremya AS 'Время', yslygi.opisanie AS 'Лечение', yslygi.stoimost AS  'Стоимость' FROM `priem` , `pacient`,`vrach` , `yslygi` WHERE fio_vrach LIKE '%" + textBox1.Text + "%';";

ADMIN
23.09.2015 в 16:58
Можно ToString после Value добавить.
Код:
ExcelApp.Cells[2,2] = dgv.Rows[0].Cells[ячейка с временем].Value.ToString();
«можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают…»
Приведенный тобой sql запрос ничего не меняет, он делает только выборку. Проблема в чём-то другом.

АЛЕКСАНДР
25.09.2015 в 06:46
Это все на этой же форме, так жэ взял рабочий код, но на этой форме он не работает... Делал я вместо ввода фамилии конкретно поиск по id , но отображал 2 строки которые явно не те которые с этим id причем что работал при 1 и 3 на остальных никак

ADMIN
25.09.2015 в 23:58
Значит либо sql запрос составлен не верно, либо что-то другое.

АЛЕКСАНДР
26.09.2015 в 14:14
Спасибо, со временем теперь все норм), жаль что я так и не успел разобрать с выборкой&#8230;

OLEG
27.09.2015 в 11:23
Если посмотреть в диспетчере задач exel не выключается а если снова нажать в нем появляется новый excel

OLEG
29.09.2015 в 07:34
exapp.quit(); написано

ADMIN
29.09.2015 в 20:09
Да, есть такая проблема.
Можно закрыть все открытые процессы (Excel) после выхода из приложения, например так:
Код:
Workbook wb = exApp.Workbooks.Add();
excelBook.Close(0);
excelApp.Quit();
Либо можно завершить процесс не закрывая приложение:
Код:
using System.Runtime.InteropServices; //добавить
exApp.Quit();
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(workSheet);
Marshal.ReleaseComObject(exApp);
Сохраняет и завершает процесс.

СЕРГЕЙ
01.10.2015 в 00:51
Что делать, если в ссылке при добавлении нет Microsoft. Office. Interop.Excel...?

РУСЛАН
01.12.2016 в 02:15
Подобная ситуация, не подскажете что сделали, а то при регистрации Microsoft.Office.Interop.Excel.dll, возникала ошибка что не зарегистрирован класс, при регистрации через regsvr32.exe /i Microsoft.Office.Interop.Excel.dll пишет что зарегистрирована, но точка входа в DllRegisterServer не найдена, что делать не пойму, через реестр руками добавлять??

СЕРГЕЙ
02.10.2015 в 10:14
Уже скачал и разобрался

МАРАТ
03.10.2015 в 07:48
Здравствуйте, попытался ваш пример использовать , но у меня выделяет красным «Worksheet» вот в этом месте…
Код:
Worksheet workSheet=(Worksheet)exApp.ActiveSheet;
что мне делать?

ADMIN
03.10.2015 в 14:45
Код:
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
using SD = System.Data;
Все добавлены?

ALEX
04.10.2015 в 22:42
У меня программа с БД Microsoft Office Access 2007 клиент с запросами на C#.
экспорт данных из DataGridView в Excel использовал ваш код .
есть одно но таблица в Excel вся растянута и читать ни читаема
под скажите как сделать желательно пример

НИКОЛАЙ
06.10.2015 в 23:20
На этой строчке вылетает workSheet.SaveAs(pathToXmlFile);
Ошибка:
Нет доступа к ‘MyFile.xls’.
Как быть?

ADMIN
07.10.2015 в 22:15
Возможно файл уже открыт и в него происходит запись или, например файл не был создан, а в него пытаются что-то записать.
Он существует по указанному пути?
Если этот файл открыть, внести изменения (любые) и нажать кнопку сохранить, то всё нормально или возникают ошибки?

НУРКАСЫМ
08.10.2015 в 12:18
у меня вопрос. Как можно(открыть) уже созданный excel документ, после редактирования которого просто сохранить его и записать в БД. С открытием файла(перенос в DTGridView) разобрался, а дальше нет

ADMIN
10.10.2015 в 02:53
Код:
//открываем
Excel.Application exApp = new Excel.Application();
Excel.Workbook workbook = exApp.Workbooks.Open(@"C:имя_файла.xlsx");
//выбираем активный лист
Excel.Worksheet worksheet = workbook.ActiveSheet;
//например, в ячейке первой строки было значение 2, а его нужно заменить на 5
workSheet.Cells[1, "A"] = 5;
//сохраняем изменения
workbook.Save();
//выход
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(workSheet);
Marshal.ReleaseComObject(exApp);

ВИКТОРИЯ
10.10.2015 в 19:44
Во время заполнения таблицы Excel на строке
Код:
workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID_факультатив"].Value;
выдает ошибку: Не удается найти столбец с именем ID_факультатив. Имя параметра: columnName
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] = "Название";
workSheet.Cells[1, 3] = "Класс";
workSheet.Cells[1, 4] = "День";
workSheet.Cells[1, 5] = "Урок";
workSheet.Cells[1, 6] = "Учитель";
int rowExcel = 2; //начать со второй строки.
for (int i = 0; i <dataGridView1.Rows.Count; i++)
{
//заполняем строку
workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID_факультатив"].Value;  //вот здесь
workSheet.Cells[rowExcel, "B"] = dataGridView1.Rows.Cells["Название"].Value;
workSheet.Cells[rowExcel, "C"] = dataGridView1.Rows.Cells["Класс"].Value;
workSheet.Cells[rowExcel, "D"] = dataGridView1.Rows.Cells["День"].Value;
workSheet.Cells[rowExcel, "E"] = dataGridView1.Rows.Cells["Урок"].Value;
workSheet.Cells[rowExcel, "F"] = dataGridView1.Rows.Cells["Учитель"].Value;
++rowExcel;

ВИКТОРИЯ
12.10.2015 в 07:14
при этом шапку таблицы создает

ADMIN
12.10.2015 в 18:03
при этом шапку таблицы создает
Ошибка не связана с Excel, поэтому шапка и выводится.
выдает ошибку: Не удается найти столбец с именем ID_факультатив. Имя параметра: columnName
Вместо «ID_факультатив» нужно указать свойство столбца ColumnName в DataGridView, а не HeaderText — текст заголовка колонки, который будет отображаться в DataGridView. Например:
Код:
dataGridView1.Columns.Add("ID", "ID_Факультатив");
workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID"].Value //OK;
workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID_Факультатив"].Value //Exception;

ВИКТОРИЯ
14.10.2015 в 06:15
Спасибо большое за ответ!!!!!! Тем более такой быстрый)
Уже разобралась)))))

АЛЕКСАНДР
14.10.2015 в 13:51
Уважаемые товарищи!
Если таблица 2х3, то заполнять ручками каждую ячейку вот так:
Код:
//Visual Basic
Public Sub export2excel(ByRef t As DataTable)
Dim xls = New Excel.Application
xls.Visible = False
xls.Workbooks.Add()
Dim Sheet As Excel.Worksheet = xls.Workbooks(1).ActiveSheet
Dim row As Integer, col As Integer
For row = 0 To t.Rows.Count - 1
For col = 0 To t.Columns.Count - 1
Sheet.Cells(row + 1, col + 1) = t(row)(col)
Next
Next
xls.Visible = True
End Sub
— это приемлемо.
А если у меня (в результате выполнения sql запроса к БД) получается таблица 20 колонок на 4000 строк, то это уже очень долго &#8212; минут 10 на Core i5. Может, есть какой-то способ передавать данные из DataTable в Worksheet оптом?

ADMIN
16.10.2015 в 00:23
В конце статьи есть один из способов.

АЛЕКСАНДР
17.10.2015 в 09:17
Как то я проглядел этот способ, через xml.
В итоге остановился на таком варианте:
Код:
//Visual Basic
Public Sub export2excel(ByRef t As DataTable, ByRef pgb As ProgressBar, ByVal b As Integer, ByVal e As Integer)
If pgb IsNot Nothing Then
pgb.Value = b
End If
Dim xls = New Excel.Application
xls.Visible = False
xls.Workbooks.Add()
Dim ws As Excel.Worksheet = xls.Workbooks(1).ActiveSheet
Dim arr(t.Rows.Count, t.Columns.Count) As Object
Dim row As DataRow, r As Integer = 0, col As Integer
Dim scale As Double = e - b
scale = 0.8 * scale / t.Rows.Count
For Each row In t.Rows
If pgb IsNot Nothing Then
pgb.Value = b + scale * r
End If
If r Mod 100 = 0 Then
Update() ' это чтобы приложение не "подвисало" во время работы длинного цикла
End If
For col = 0 To t.Columns.Count - 1
arr(r, col) = row(col)
Next
r = r + 1
Next
For col = 0 To t.Columns.Count - 1
ws.Cells(1, col + 1) = t.Columns(col).Caption
Next
ws.Range("A1").Resize(1, t.Columns.Count).Font.Bold = True
If pgb IsNot Nothing Then
pgb.Value = b + (e - b) * 0.9
End If
ws.Range("A2").Resize(t.Rows.Count + 1, t.Columns.Count).Value = arr
ws.Columns("A:ZZ").AutoFit()
If pgb IsNot Nothing Then
pgb.Value = e
End If
xls.Visible = True
End Sub
Тоже цикл, тоже перебирает ячейки по одной, но заполняет простой массив, а не worksheet.
Второй момент, важно использовать for each row in …, а не for row = 0… — это тоже значительно ускоряет копирование. В итоге таблица 20х4000 передаётся за несколько секунд. Вполне wиндовая скорость.
Прогрессбар можно не подавать, можно вместо него подать Nothing, тогда b и e (begin и end) &#8212; любые. Если используем ProgressBar, то подаём b>=pgb.Minimum e<=pgb.Maximum.
В теле функции я pgb.Minimum и pgb.Maximum не трогаю намеренно, потому что подразумевается, что работа функции export2excel выполняет только часть процесса, например
Код:
pgb.Minimum = 0
pgb.Maximum = 100
pgb.Value = 0
получаем таблицу DataTable t &#8212; и пусть это будет 30%
pgb.Value = 30
export2excel(t, pgb, 30, 100) &#8212; &#039;экспорт в эксель займёт оставшиеся 30-70%

ЭЛЬВИРА
17.10.2015 в 19:11
Не удалось получить фабрику класса COM для компонента с CLSID {00024500-0000-0000-C000-000000000046} из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Ругается на первой же строчке

ЭЛЬВИРА
19.10.2015 в 08:14
Подскажите пожалуйста, можно ли не создавать новый файл, а записывать данные уже в заранее подготовленный шаблон. Т.е. у меня в exel есть формулы и мне только нужно, чтобы программа обновляла поля, загруженные из DataGridView.

ЭЛЬВИРА
19.10.2015 в 17:24
Извините, все проблемы решила

ADMIN
21.10.2015 в 05:50
Подскажите пожалуйста, можно ли не создавать новый файл, а записывать данные уже в заранее подготовленный шаблон
Можно &#8212; это ведь обычный файл.

СЕРЖ
27.12.2016 в 22:07
Есть проблемы при экспорте из датагрид в екзель.
Вот код
Код:
private void ExportToExcel()
{
Microsoft.Office.Interop.Excel.Application exApp = new Microsoft.Office.Interop.Excel.Application();
// Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;
Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
//Книга.
ObjWorkBook = exApp.Workbooks.Add(System.Reflection.Missing.Value);
//Таблица.
ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];
exApp.Workbooks.Add();
Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)exApp.ActiveSheet;
workSheet.Cells.NumberFormat = “0.00”;
workSheet.Cells.Replace(‘,’, ‘.’);
workSheet.Cells[1, 1] = “x”;
workSheet.Cells[1, 2] = “Prls”;
workSheet.Cells[1, 3] = “Prlspv”;
workSheet.Cells[1, 4] = “Pvihrls”;
int rowExcel = 2; //начать со второй строки.
for (int i = 0; i < result_grid.Rows.Count; i++)
{
//заполняем строку
workSheet.Cells[rowExcel, "A"] = result_grid.Rows.Cells["x"].Value;
workSheet.Cells[rowExcel, "B"] = result_grid.Rows.Cells["Prls"].Value;
workSheet.Cells[rowExcel, "C"] = result_grid.Rows.Cells["Prlspv"].Value;
workSheet.Cells[rowExcel, "D"] = result_grid.Rows.Cells["Pvihrls"].Value;
++rowExcel;
}
string pathToXmlFile;
pathToXmlFile = Environment.CurrentDirectory + "" + "MyFile.xls";
pathToXmlFile.Replace(',', '.');
workSheet.SaveAs(pathToXmlFile);
// exApp.Quit();
exApp.Visible = true;
exApp.UserControl = true;
// GC.Collect();
// GC.WaitForPendingFinalizers();
// Marshal.ReleaseComObject(workSheet);
// Marshal.ReleaseComObject(exApp);
// Microsoft.Office.Interop.Excel.Workbook wb = exApp.Workbooks.Add();
// Microsoft.Office.Interop.Excel.Workbook.Close(0);
// exApp.Quit();
}
1. Проблема в ячейках екзель числа представлены как текст. Как это исправить?
2. Открывается не только мой файл но и еще пустая книга. Как ее убрать?
 
Мы в соцсетях: