Как сохранить datagridview в excel
у меня есть 10k строк и 15 столбцов в моем представлении сетки данных. Я хочу экспортировать эти данные в лист excel o нажмите кнопку. Я уже пробовал С ниже код.
это работает для меня, но это занимает много времени завершить процесс экспорта.
можно ли экспортировать из dataGridView (с 10k строками)в excel мгновенно одним нажатием кнопки?
кроме этого, когда я попытался скопировать все dataGridview содержание для того чтобы закрепить доску и после этого вставить ее к листу excel вручную, оно случается почти немедленно.
Итак, есть ли способ скопировать все ячейки dataGridView в клип и вставить его в лист excel (с форматированием ячеек) одним нажатием кнопки?
у меня есть код для копирования в буфер обмена, как показано ниже, но я не знаю, как вставить его в новый лист Excel, открыв его.
Я решил это простым методом копирования и вставки. Я не знаю, что это лучший способ сделать это, но для меня это работает хорошо и почти мгновенно. Вот мой код.
во-первых, вам понадобится Microsoft.Office.Interop.Excel ссылка в вашем проекте. См.MSDN о том, как добавить его.
Я не собирался красть ответ @Jake и @Cornelius, поэтому я попытался его отредактировать. но его отвергли. В любом случае, единственное улучшение, на которое я должен указать, - это избежать дополнительного пустого столбца в excel после вставки. Добавление одной строки dataGridView1.RowHeadersVisible = false; скрывает так называемый "заголовок строки", который появляется в левой части DataGridView, и поэтому он не выбран и не скопирован в буфер обмена, когда вы делаете dataGridView1.SelectAll();
взаимодействие происходит медленно и имеет другие проблемы, использование буфера обмена кажется не расширяемым. Вот два других способа сделать это
Я бы начал с ClosedXML.
Мне нравится решение Джейка. Проблема без заголовка решается следующим образом
конечно, это работает только, вы знаете, что заголовки должны быть впереди времени.
это то, что я использую для своего gridview, попробуйте использовать его для данных yr , он отлично работает:
этот ответ для первого вопроса, почему это занимает так много времени, и он предлагает альтернативное решение для экспорта DataGridView в Excel.
MS Office Interop работает медленно, и даже Microsoft не рекомендует использовать взаимодействие на стороне сервера и не может использоваться для экспорта больших файлов Excel. Более подробную информацию см. Почему бы не использовать Ole Automation С точки зрения Microsoft.
Interop сохраняет файлы Excel в формате XLS (старый файл Excel 97-2003 формат) и поддержка Office 2003 завершилась. Microsoft Excel выпустила XLSX формат файла с Office 2007 и рекомендует использовать OpenXML SDK вместо взаимодействия. Но XLSX файлы на самом деле не так быстро и не очень хорошо обрабатывать большие файлы Excel, потому что они основаны на формате XML-файла. Вот почему Microsoft также выпустила XLSB формат файла с Office 2007, формат файла, который рекомендуется для больших файлов Excel. Это двоичный формат. Поэтому лучшее и быстрое решение-сохранить XLSB файлы.
см. следующий пример кода в качестве альтернативы экспорту DataGridView в Excel:
И так для начала создадим Windows Forms приложение на языке csharp, после чего добавим на форму два элемента управления: DataGridView (dgv) и кнопку с надписью: Экспорт в Excel.
Подготовка
И так для начала создадим метод CreateTable.
Нажимаем F5 или Ctrl+F5 и получаем следующий результат.
Экспорт в Excel
Первый этап закончен. Теперь переходим ко второму этапу, который так же начнётся с создания метода. И так, для начала создадим метод ExportToExcel. С помощью него, как думаю не трудно догадаться, мы собственно и будем выполнять экспорт данных в Excel файл.
Для работы с Excel нам понадобиться добавить в проект сборку: Microsoft.Office.Interop.Excel.
Чтобы каждый раз не обращаться к членам и типам данной сборки, используя полные имена, добавим следующую строку:
Если сейчас Вы обратите своё внимание на написанный ранее код, то заметите, что в методе CreateTable имя класса DataTable почему-то стало подчеркнутым или выделенным красным цветом. Это произошло, потому что класс DataTable, присутствует как в пространстве имён Microsoft.Office.Interop.Excel так и в пространстве имён System.Data, в результате чего возник конфликт имён.
Чтобы разрешить возникший конфликт создадим псевдоним для пространства имён System.Data
После чего в исходном коде перед именем класса DataTable укажем имя псевдонима.
Конфликта больше нет и теперь можно работать дальше.
И так, чтобы выполнить экспорт данных в excel файл нам понадобиться для начала создать объект класса Application. Здесь так же возникает конфликт имен, поэтому в данном примере я создам ещё один псевдоним, но Вы можете просто указать полное имя:
Следующая строка используется для отладки, чтобы мы могли отслеживать результаты в ходе выполнения кода.
Созданная книга по умолчанию содержит три листа, поэтому добавлять их в данном примере не требуется. Поэтому сразу же получаем активный лист.
Первая цифра это номер строки, вторая ячейки. Вместо цифры Вы можете указывать и буквенное обозначение.
Экспортируем данные из DataGridView в Excel файл.
В данном примере файл будет создан в папке Debug текущего проекта.
И в конце завершаем работу с Microsoft Excel.
На этом экспорт завершен, окончательный результат можно увидеть на картинке ниже.
На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.
Дополнение:
1. Свойство Visible влияет на быстродействие, поэтому перед выполнением цикла его лучше установить в значение false.
Pirnazar
The Codeby
ООО Кодебай
АЛЕКСАНДР
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
АЛЕКСАНДР
12.09.2015 в 23:18
try и catch есть только в подключении к бд. а программа ссылается на строку
– здесь точно 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).
АЛЕКСАНДР
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
можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают,
ADMIN
23.09.2015 в 16:58
Можно ToString после Value добавить.
«можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают…»
Приведенный тобой sql запрос ничего не меняет, он делает только выборку. Проблема в чём-то другом.
АЛЕКСАНДР
25.09.2015 в 06:46
Это все на этой же форме, так жэ взял рабочий код, но на этой форме он не работает. Делал я вместо ввода фамилии конкретно поиск по id , но отображал 2 строки которые явно не те которые с этим id причем что работал при 1 и 3 на остальных никак
ADMIN
25.09.2015 в 23:58
Значит либо sql запрос составлен не верно, либо что-то другое.
OLEG
27.09.2015 в 11:23
Если посмотреть в диспетчере задач exel не выключается а если снова нажать в нем появляется новый excel
OLEG
29.09.2015 в 07:34
exapp.quit(); написано
ADMIN
29.09.2015 в 20:09
Да, есть такая проблема.
Можно закрыть все открытые процессы (Excel) после выхода из приложения, например так:
Сохраняет и завершает процесс.
СЕРГЕЙ
01.10.2015 в 00:51
Что делать, если в ссылке при добавлении нет Microsoft. Office. Interop.Excel.
СЕРГЕЙ
02.10.2015 в 10:14
Уже скачал и разобрался
МАРАТ
03.10.2015 в 07:48
Здравствуйте, попытался ваш пример использовать , но у меня выделяет красным «Worksheet» вот в этом месте…
ADMIN
03.10.2015 в 14:45
НИКОЛАЙ
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
ВИКТОРИЯ
10.10.2015 в 19:44
Во время заполнения таблицы Excel на строке
ВИКТОРИЯ
12.10.2015 в 07:14
при этом шапку таблицы создает
ADMIN
12.10.2015 в 18:03
при этом шапку таблицы создает
Ошибка не связана с Excel, поэтому шапка и выводится.
выдает ошибку: Не удается найти столбец с именем ID_факультатив. Имя параметра: columnName
Вместо «ID_факультатив» нужно указать свойство столбца ColumnName в DataGridView, а не HeaderText — текст заголовка колонки, который будет отображаться в DataGridView. Например:
ВИКТОРИЯ
14.10.2015 в 06:15
Спасибо большое за ответ. Тем более такой быстрый)
Уже разобралась)))))
ADMIN
16.10.2015 в 00:23
В конце статьи есть один из способов.
АЛЕКСАНДР
17.10.2015 в 09:17
Как то я проглядел этот способ, через xml.
В итоге остановился на таком варианте:
ЭЛЬВИРА
19.10.2015 в 08:14
Подскажите пожалуйста, можно ли не создавать новый файл, а записывать данные уже в заранее подготовленный шаблон. Т.е. у меня в exel есть формулы и мне только нужно, чтобы программа обновляла поля, загруженные из DataGridView.
ЭЛЬВИРА
19.10.2015 в 17:24
Извините, все проблемы решила
СЕРЖ
27.12.2016 в 22:07
Есть проблемы при экспорте из датагрид в екзель.
Вот код
I have 10k rows and 15 column in my data grid view. I want to export this data to an excel sheet o button click. I have already tried with the below code.
This is working for me but it is taking lots of time to complete exporting process.
Is it possible to export from dataGridView (with 10k rows)to excel instantly on a button click?
Other than this, when I tried copy all dataGridview contents to clip board and then paste it to excel sheet manually, it happen almost instantly.
So is there a way to copy all dataGridView cells to clip board and paste it to excel sheet(with cell formatting) on a button click?
I have code for copy to clipboard as below, but I don't know how to paste it in to a new excel sheet by opening it.
14 Answers 14
I solved this by simple copy and paste method. I don't know it is the best way to do this but,for me it works good and almost instantaneously. Here is my code.
This is a great question and I was surprised at how difficult it was to find a clear and complete answer, most of the answers I found were either sudo-code or not 100% complete.
First off, you will need the Microsoft.Office.Interop.Excel reference in your project. See MSDN on how to add it.
I did not intend to steal @Jake and @Cornelius's answer, so i tried editing it. but it was rejected. Anyways, the only improvement I have to point out is about avoiding extra blank column in excel after paste. Adding one line dataGridView1.RowHeadersVisible = false; hides so called "Row Header" which appears on the left most part of DataGridView, and so it is not selected and copied to clipboard when you do dataGridView1.SelectAll();
924 1 1 gold badge 12 12 silver badges 37 37 bronze badges It worked for me. Thanks. It removes the blank rows after every row of my DataGridView. 4,550 3 3 gold badges 39 39 silver badges 54 54 bronze badgesInterop is slow and has other issues, using the the clipboard seems non extensible. Here are two other ways to do this
I'd start with ClosedXML.
I like Jake's solution. The problem with no header is resolved by doing the following
of course this only works is you know what the headers should be ahead of time.
115 1 1 gold badge 2 2 silver badges 9 9 bronze badgesthat's what i use for my gridview, try to use it for yr data , it works perfectly :
This answer is for the first question, why it takes so much time and it offers an alternative solution for exporting the DataGridView to Excel.
MS Office Interop is slow and even Microsoft does not recommend Interop usage on server side and cannot be use to export large Excel files. For more details see why not to use OLE Automation from Microsoft point of view.
Interop saves Excel files in XLS file format (old Excel 97-2003 file format) and the support for Office 2003 has ended. Microsoft Excel released XLSX file format with Office 2007 and recommends the usage of OpenXML SDK instead of Interop. But XLSX files are not really so fast and doesn’t handle very well large Excel files because they are based on XML file format. This is why Microsoft also released XLSB file format with Office 2007, file format that is recommended for large Excel files. It is a binary format. So the best and fastest solution is to save XLSB files.
See the following code sample as alternative of exporting DataGridView to Excel:
Читайте также: