Как сохранить 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:
Экспорт данных в Excel из DataGridView. Как это делается помогите пожалуйста? Из БД Экспорт получается но я хотел после компиляции из DataGridView экспортировать.
Экспорт данных из datagridview в Excel
Всем привет! Может кто-нибудь подсказать как сделать "Экспорт данных их datagridview в Exel", то.
Экспорт данных из Excel-я в DataGridView
Здравствуйте друзья Как реализовать экспорт данных из экзеля в datagridview.
Экспорт данных из dataGridView в Excel?
Я вывожу запросом данные из базы в dataGridView (на русунке ) хочу вывести эти данные в Excel как.
Решение
kenjebek, Вы хотите из самой datagridview экспортировать данные в Excel ?
Добавлено через 18 секунд
что вам конкретно не понятно ?
Добавлено через 10 минут
подскажите, как запихнуть код из 2 поста так, чтобы это все работало при сохранении через меню. и что нужно дописать в using помимо этого?
подскажите, как запихнуть код из 2 поста так, чтобы это все работало при сохранении через меню. и что нужно дописать в using помимо этого?
в пространстве имен ни чего не надо дописывать, так как там все уже описано, а вот в referense необходимо добавить библиотеку Microsoft.Interop.Excel.
Для меню все просто, делаете подпрограмму того кода который представлен выше и на событие меню онклик вставляете подпрограмму.
Можно даже для разных DataGridView сделать.
подскажите по подробнее об экспорте в уже созданный excel файл, а то не получается, открываются два файла, созданный и новый создается.
Господа, такая проблема. Поменял немного код ( нужно чтобы выводил инфу в созданную форму с 15 строки ), НО при таком коде выдает ошибку не соответствия типов, как быть?
Helios1.618,
Добрый день! воспользовался этим кодом, выдает ошибку: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Ничего понять не могу.
меня в ваших кодах по Excel в данной теме смущает такой момент - непосредственный родитель у ячейки есть лист, а не приложение Excel. В приложенных кодах у вас указано
мне кажется, что правильнее писать так
вот код, потестировал, ошибок нет
Pavel55,
Спасибо! разобрался.
Еще вопрос.
сделал приложение, запускается первая форма с простеньким поиском по базе и экспорта результата в EXCEL.
при экспорте в диспетчере задач появляется процесс EXCEL.exe. если я закрываю созданную книгу, он завершается.
когда я запускаю вторую форму (на ней реализовано добавление данных в БД и вывод добавленной в БД информации в dataGridView, а также экспорт в EXCEL, печать через EXCEL, и сохранение книг), при ее открытии в диспетчере задач появляются сразу два процесса EXCEL.exe. Почему так происходит понять не могу.
Можете подсказать? И помочь в решении этой проблемы?
И так для начала создадим Windows Forms приложение на языке csharp, после чего добавим на форму два элемента управления: DataGridView (dgv) и кнопку с надписью: Экспорт в Excel.
Подготовка
И так для начала создадим метод CreateTable.
С помощью данного метода мы создадим таблицу с данными, которые затем, например, в событие Form.Load, загрузим в элемент управления DataGridView.
Нажимаем 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.
На этом экспорт завершен, окончательный результат можно увидеть на картинке ниже.
Если Вам нужно вывести данные не из DataGridView, а из DataTable то это, например можно сделать следующим образом:
На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.
Дополнение:
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
можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают,
«можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают…»
Приведенный тобой 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
ВИКТОРИЯ
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.
Almost all answer here write a (HtmlTextWriter) string or have Interop code. DO NOT USE EITHER. This will cause you problems later on with DateTime and Decimal formatting. Also Excel will give a warning because you are not generating a "real" Excel file but a HTML page with an .xls extension. Start using a specialized library for creating Excel files, like EPPlus. Example here and here.
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.
I was able to grab the header text by setting the clipboard copy mode to select headers also: ` DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText DataGridView1.MultiSelect = True DataGridView1.SelectAll()`
How can I export these to an exist Excel file's specific rows? Specific row can be determined by this: Excel.Range CR = (Excel.Range)xlWorkSheet.Cells[15, 1]; How can I append data to an exist Excel file?
@MeysamTolouee I needed to know the same thing, I figured out how to save my results, I posted my code below.
This works for me and many other people I created the Application for, but for one user it creates an image in Excel. It is not located in a Cell although it looks like it is in A1. I cannot seem to figure out anything wrong with the code. Anyone run into this issue?
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.
// For some reason column A is always blank in the worksheet. As @Rahul mentioned below, the first blank column can be avoided in the clipboard copy by adding dataGridView1.RowHeadersVisible = false; (this hides the Row Header column). You can reshow it at the end of the clipboard copy if needed.
@Cornelius How do I make the copy/export process task continue in the background or make the copying asynchronous
Thanks. This worked for me! I up-voted this one. I had trouble in Visual Studio 2017 community edition finding the Mcrosoft.Office.Interop.Excel but if you add the Microsoft Excel 15.0 Object Library under COM in the reference manager it will add the assembly to your project.
Hi, your code worked like a charm, however, i would like to paste some texte in excel before the datagridview; like a title, is there a way to do that ?
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();
Good code, but I would add it's crucial to add these 2 lines: workbook.SaveAs(ExcelFileSavePath); to save it and excel.Quit() to kill the process otherwise it's going to have that read-only message when opening Excel file
Interop 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.
that'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:
I'm planning to export it to excel to enable me to generate report from the datagridview.
Can you provide me ways to do this?
9 Answers 9
Code below creates Excel File and saves it in D: drive It uses Microsoft office 2007
FIRST ADD REFERRANCE (Microsoft office 12.0 object library ) to your project
Then Add code given bellow to the Export button click event-
Also, looping is the wrong approach. You need to create an object array and write that to a range in Excel. No loop necessary except to create the object array.
My answer below has an example of creating an object array and then setting that to a range in Excel. If you don't need formatting then you should always export to CSV because it's significantly faster than Excel automation. I'm happy to help. Review my answer and let me know if you have any questions. The above answer is fine, but you should remove the .tostring so that The data type is correct within in Excel. Otherwise you have the equivalent of a CSV as everything is text.
Excel Method
This method is different than many you will see. Others use a loop to write each cell and write the cells with text data type.
This method creates an object array from a DataTable or DataGridView and then writes the array to Excel. This means I can write to Excel without a loop and retain data types.
After copying the code to your solution you will use it like this.
In your button code add this and change the names to your controls.
To open your file after exporting use this line
System.Diagnostics.Process.Start("The location and filename of your file")
In the WriteArray method you'll want to change the line that saves the workbook to where you want to save it. Probably makes sense to add this as a parameter.
I actually don't use this method in my Database program because it's a slow method when you have a lot of rows/columns. I instead create a CSV from the DataGridView. Writing to Excel with Excel Automation is only useful if you need to format the data and cells otherwise you should use CSV. You can use the code after the image for CSV export.
Читайте также: