Загрузка данных из Microsoft Excel в DataGridView: Справочник по C#
В данной инструкции рассмотрены 5ть примеров реализации получения данных из файла Microsoft Excel 2003-2007.
- Пример №1 – получение данных с использованием библиотеки объектов «Microsoft Excel 14.0»;
- Пример №2 – получение данных с использованием класса «OleDbConnection»;
- Пример №3 – получение данных с использованием библиотеки «Excel Data Reader – Read Excel files in .Net»;
- Пример №4 – получение данных из буфера обмена используется класс «Clipboard»;
- Пример №5 – ручной ввод;
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на форму три компонента:
-
textBox1 — в данном компоненте будет выводится путь, имя и расширение выбранного файла;
Выберете компонент «dataGridView1» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете пункт «Свойства».

Установите следующие параметры в свойствах компонента:
- Dock – None – свойство задает границы элемента управления, прикрепленные к его родительскому элементу управления и определяет способ изменения его размеров относительно родительского элемента управления. http://msdn.microsoft.com
- Anchor — Top, Bottom, Left, Right — свойство задает границы контейнера, с которым связан элемент управления, и определяет способ изменения его при изменении размеров его родительского элемента. http://msdn.microsoft.com

Пример №1
В данном примере рассмотрено использование функций приложения Microsoft Office Excel из пакета Microsoft Office, c использованием библиотеки объектов Microsoft Excel 14. Данная библиотека позволяет управляемому коду взаимодействовать с объектной моделью приложения Microsoft Office, основанной на модели COM. Сделайте двойной клик по компоненту «button1», вы перейдете в автоматически созданный метод «button1_Click», события компонента «Click».

Перейдите в «Обозреватель решений» и найдите группу «References» которая содержит все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».

У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.
- Сборки — список всех компонентов платформы .NET Framework, ссылки на которые можно добавить.
- Решение — список всех повторно используемых компонентов, созданных в локальных проектах.
- COM — список всех COM-компонентов, ссылки на которые можно добавить.
- Обзор — позволяет осуществлять поиск компонента в файловой системе.
Выберете группу «COM» и ее подгруппу «Библиотеки типов». В центральной части окна вам будет предложен список доступных библиотек для подключения к вашему проекту. Найдите в списке библиотеку «Microsoft Excel 14.0 Object Library» и поставьте галочку рядом с именем данной библиотеки. В нижней части окна нажмите кнопку «ОК».

После добавления библиотеки, у вас появится три новых пункта в обозревателе решений:
- Microsoft.Office.Core;
- Microsoft.Office.Interop.Excel;
- VBIDE.

Для работы с добавленными ссылками необходимо добавить следующие пространства имен с использованием директивы «using»:
- using System.Reflection; — указывается ссылка на использование типов в пространстве имен «System.Reflection», при этом уточнение использования типа в этом пространстве имен не требуется;
- using ExcelObj = Microsoft.Office.Interop.Excel; — создается псевдоним пространства имен «Microsoft.Office.Interop.Excel».
В данном примере для открытия файла используется класс «OpenFileDialog», реализующий открытие окна для выбора файла по заданному фильтру «Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx». Данный фильтр так же реализует защиту от выбора файла не относящегося к Excel.
OpenFileDialog ofd = new OpenFileDialog(); //Задаем расширение имени файла по умолчанию. ofd.DefaultExt = "*.xls;*.xlsx"; //Задаем строку фильтра имен файлов, которая определяет //варианты, доступные в поле "Файлы типа" диалогового //окна. ofd.Filter = " Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx"; //Задаем заголовок диалогового окна. ofd.Title = "Выберите документ для загрузки данных";
После выбора файла создается новый объект «Application» или приложение «Excel», которое может содержать одну или более книг, ссылки на которые содержит свойство «Workbooks». Книги — объекты «Workbook», могут содержать одну или более страниц, ссылки на которые содержит свойство «Worksheets». Страницы – «Worksheet», могут содержать объекты ячейки или группы ячеек, ссылки на которые становятся доступными через объект «Range». Полученные данные из файла будут заноситься в таблицу «dt», созданную с использованием класса «DataTable».
ExcelObj.Application app = new ExcelObj.Application(); ExcelObj.Workbook workbook; ExcelObj.Worksheet NwSheet; ExcelObj.Range ShtRange; DataTable dt = new DataTable();
В коде присутствует проверка, что пользователь действительно выбрал файл, если данное условие выполнено, в текстовое поле с помощью свойства «FileName», класса «OpenFileDialog» помещается путь, имя и расширение выбранного файла в элемент управления «textBox1».
if (ofd.ShowDialog() == DialogResult.OK) < textBox1.Text = ofd.FileName;
Для открытия существующего документа используется метод «Open» из набора «Excel.Workbooks», в качестве основного параметра указывается путь к файлу, остальные параметры остаются пустыми.
workbook = app.Workbooks.Open(ofd.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
Полный список параметров метода «Open» приведен в таблице ниже.
| Имя параметра | Описание |
|---|---|
| FileNamee | Имя открываемого файла |
| UpdateLinks | Способ обновления ссылок в файле |
| ReadOnly | При значении true открытие только для чтения |
| Format | Определение формата символа разделителя |
| Password | Пароль доступа к файлу (до 15 символов) |
| WriteResPassword | Пароль на сохранение файла |
| IgnoreReadOnlyRecommended | При значении true отключается вывод запроса на работу без внесения изменений |
| Origin | Тип текстового файла |
| Delimiter | Разделитель при Format = 6 |
| Editable | Используется только для надстроек Excel 4.0 |
| Notify | При значении true имя файла добавляется в список нотификации файлов |
| Converter | Используется для передачи индекса конвертера файла используемого для открытия файла |
| AddToMRU | При true имя файла добавляется в список открытых файлов |
| Local | — |
| CorruptLoad | — |
Для доступа к листу из книги «Workbook», используется метод «Sheets.get_Item» с указанием номера листа. Нумерация листов начинается с 1.
NwSheet = (ExcelObj.Worksheet)workbook.Sheets.get_Item(1);
Чтобы получить объект Microsoft.Office.Interop.Excel.Range, который представляет все ячейки, содержащие значение на данный момент, используется свойство станицы «Worksheet.UsedRange».
ShtRange = NwSheet.UsedRange;
После получения объекта «Range», с помощью цикла «For» загружается первая строка из таблицы и каждое значение устанавливается в качестве имени колонки таблицы.
for (int Cnum = 1; Cnum
Далее таким же способом загружаются все оставшиеся строки с добавлением в таблицу.
for (int Rnum = 2; Rnum > dt.Rows.Add(dr); dt.AcceptChanges(); >
По завершении загрузки данных с указанного листа, сформированная таблица «dt» подключается к элементу управления «dataGridView1». Так же открытый объект «Application» или приложение «Excel» закрывается.
dataGridView1.DataSource = dt; app.Quit();
Полный листинг рассмотренного кода, приведен ниже, добавьте его в метод «button1_Click» компонента «button1».
OpenFileDialog ofd = new OpenFileDialog(); //Задаем расширение имени файла по умолчанию. ofd.DefaultExt = "*.xls;*.xlsx"; //Задаем строку фильтра имен файлов, которая определяет //варианты, доступные в поле "Файлы типа" диалогового //окна. ofd.Filter = "Excel Sheet(*.xlsx)|*.xlsx"; //Задаем заголовок диалогового окна. ofd.Title = "Выберите документ для загрузки данных"; ExcelObj.Application app = new ExcelObj.Application(); ExcelObj.Workbook workbook; ExcelObj.Worksheet NwSheet; ExcelObj.Range ShtRange; DataTable dt = new DataTable(); if (ofd.ShowDialog() == DialogResult.OK) < textBox1.Text = ofd.FileName; workbook = app.Workbooks.Open(ofd.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //Устанавливаем номер листа из котрого будут извлекаться данные //Листы нумеруются от 1 NwSheet = (ExcelObj.Worksheet)workbook.Sheets.get_Item(1); ShtRange = NwSheet.UsedRange; for (int Cnum = 1; Cnum dt.AcceptChanges(); string[] columnNames = new String[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) < columnNames[0] = dt.Columns[i].ColumnName; >for (int Rnum = 2; Rnum > dt.Rows.Add(dr); dt.AcceptChanges(); > dataGridView1.DataSource = dt; app.Quit(); > else Application.Exit();
Пример №2
Данный пример в качестве механизма получения данных использует класс «OleDbConnection», который предоставляет открытое подключение к источнику данных. При подключении необходимо указать строку специальную строку с несколькими параметрами:
- Provider=Microsoft.ACE.OLEDB.12.0 – имя поставщика OLE DB;
- Data Source=ofd.FileName – путь к источнику данных полученный при выборе файла в диалоговом окне;
- Extended Properties='Excel 12.0 XML' – параметр расширенного подключения;
- HDR = YES — указывает, что первая строка содержит имена столбцов, а не данные. Значение «NO» свидетельствует, что лист не содержит заголовков столбцов.
Драйвер Excel считывает определенное количество строк (по умолчанию 8 строк) в указанный источник для определения типа данных каждого столбца. Если столбец содержит смешанные типы данных, особенно если числовые данные смешаны с текстовыми данными, драйвер принимает решение в пользу того типа данных, которого больше, и возвращает значения NULL в ячейки, содержащие данные другого типа. (В случае равенства преимущество получает числовой тип.) Большинство параметров форматирования ячеек в листе Excel не затрагивает это определение типа данных. Можно изменить поведение драйвера Excel, указав режим импорта. Чтобы указать режим импорта, необходимо добавить параметр IMEX=1 к значению расширенных свойств в строке соединения. В этом состоянии драйвер принудительно преобразовывает смешанные данные в текст. После составления строки подключения, устанавливается соединение с указанным файлом через класс «OleDbConnection»
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr); con.Open();
При успешном подключении к источнику данных Excel с помощью «Microsoft ADO.NET», создаётся расположенный в памяти кэш данных, с использованием класса «DataSet». Далее извлекается список таблиц метаданных с помощью метода «GetOleDbSchemaTable».
DataSet ds = new DataSet(); DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] < null, null, null, "TABLE" >);

После получения таблицы с листами, получаем название первого листа, для создания sql запроса к файлу. Изменяя значение «Rows», вы изменяете, номер листа в книге, к которому будет выполнен запрос.
string sheet1 = (string)schemaTable.Rows[0].ItemArray[2]; string select = String.Format("SELECT * FROM []", sheet1);

Далее при помощи класса «OleDbDataAdapter» и его метода «Fill» данные загружаются в Dataset – «ds».
System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con); ad.Fill(ds);
Полный листинг примера приведен ниже.
OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.xls;*.xlsx"; ofd.Filter = "Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx"; ofd.Title = "Выберите документ для загрузки данных"; if (ofd.ShowDialog() == DialogResult.OK) < textBox1.Text = ofd.FileName; String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ofd.FileName + ";Extended Properties='Excel 12.0 XML;HDR=YES;';"; System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr); con.Open(); DataSet ds = new DataSet(); DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] < null, null, null, "TABLE" >); string sheet1 = (string)schemaTable.Rows[0].ItemArray[2]; string select = String.Format("SELECT * FROM []", sheet1); System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con); ad.Fill(ds); DataTable tb = ds.Tables[0]; con.Close(); dataGridView1.DataSource = tb; con.Close(); > else
Пример №3
Для работы с документами также можно воспользоваться библиотеками сторонних производителей. Для примера рассмотрим библиотеку «Excel Data Reader – Read Excel files in .Net». Данный компонент вы можете скачать как с нашего сайта Rusfolder.net, так и с сайта производителя Codeplex.com.

Скачайте данный компонент и перейдите в обозреватель решений. Найдите группу «References», в которой содержатся все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».

Выберете группу «Обзор», данная группа позволяет вам осуществить поиск компонента в файловой системе. Нажмите на кнопку «Обзор…», расположенную в нижней части окна менеджера ссылок.

У вас откроется окно с заголовком «Выберете файлы, на которые нужно установить ссылки», перейдите в директорию со скачанными библиотеками. Данные библиотеки находятся в архиве «WinRar», распакуйте его. В папке с распакованным архивом вы увидите две директории:
- Net20 — директория содержит библиотеки необходимые при работе с .Net Framework версии от 2.0 до 4.0;
- Net45 – директория содержит библиотеки необходимые при работе с .Net Framework версии 4.5.
При создании данного проекта был выбран .Net Framework версии 3.5, поэтому переходим в директорию «Net20» и выбираем две библиотеки расположенные в ней, это «Excel.dll» и «ICSharpCode.SharpZipLib.dll». После выбора данных библиотек, нажмите на кнопку «Добавить» расположенную в нижней части данного окна.

После добавления библиотек, вы увидите их название, и путь к ним в центральной части окна менеджера ссылок. Так же напротив каждой из них будет установлена галочка, это означает, что в проект будут добавлены ссылки на обе библиотеки. В левой части окна будет выведено описание библиотек, это «Имя», «Автор» и «Версия файла». Нажмите на кнопку «ОК», расположенную в нижней части окна менеджера.

После добавления ссылок на библиотеки, у вас появится два новых пункта в обозревателе решений.

Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму элемент управления «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button3_Click», события компонента «Click». Добавьте приведенный ниже листинг в тело данного метода.
//http://exceldatareader.codeplex.com/ OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.xls;*.xlsx"; ofd.Filter = "Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx"; ofd.Title = "Выберите документ для загрузки данных"; if (ofd.ShowDialog() == DialogResult.OK) < textBox1.Text = ofd.FileName; System.IO.FileStream stream = System.IO.File.Open(ofd.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); Excel.IExcelDataReader IEDR; int fileformat = ofd.SafeFileName.IndexOf(".xlsx"); if (fileformat >-1) < //2007 format *.xlsx IEDR = Excel.ExcelReaderFactory.CreateOpenXmlReader(stream); >else < //97-2003 format *.xls IEDR = Excel.ExcelReaderFactory.CreateBinaryReader(stream); >//Если данное значение установлено в true //то первая строка используется в качестве //заголовков для колонок IEDR.IsFirstRowAsColumnNames = true; DataSet ds = IEDR.AsDataSet(); //Устанавливаем в качестве источника данных dataset //с указанием номера таблицы. Номер таблицы указавает //на соответствующий лист в файле нумерация листов //начинается с нуля. dataGridView1.DataSource = ds.Tables[0]; IEDR.Close(); > else
В данном примере рассмотрен листинг реализующий вставку данных скопированных в буфер обмена из файла Excel. Для получения данных из буфера обмена используется класс «Clipboard» с использованием его метода «GetDataObject», который извлекает данные находящиеся в данный момент, в системном буфере обмена. Во избежание ошибок с форматом получаемых данных, используется интерфейс «IDataObject», который предоставляет не зависящий от формата, механизм передачи данных.
IDataObject dataInClipboard = Clipboard.GetDataObject(); string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text);
Более подробно ознакомиться с классом «Clipboard», вы можете на сайте Microsoft MSDN.
Так как в буфере обмена, все данные содержаться в виде одной строки и их необходимо разбить на массив данных.

Данную задачу решает метод «String.Split». Метод возвращает строковый массив, содержащий подстроки разделенные элементами «r» — возврат каретки и «n» — перевод строки.
char[] rowSplitter = < 'r', 'n' >; string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries);

Полученный массив строк содержит «t» — знак горизонтальной табуляции, который разделят значения ячеек. Для добавления столбцов с заголовками (если такая строка скопирована в буфер обмена), необходимо взять из массива первый элемент и с использованием метода «String.Split» разбить на новый массив, указав в качестве элемента разделения знак горизонтальной табуляции — «t».

Далее необходимо с помощью цикла «foreach» пройти по всему массиву и добавить новые колонки с указанием в качестве имени полученное значение.
string[] words = rowsInClipboard[0].Split('t'); foreach (string word in words) < dt.Columns.Add(word); >По такому же принципу происходит добавление строк в таблицу. for (int i = 2; i
После получения всех данных из буфера обмена и заполнения таблицы «dt», она устанавливается в качестве источника данных элементу управления «dataGridView1». Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму компонент «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button4_Click», события компонента «Click». Добавьте приведенный ниже полный листинг в тело данного метода.
//Переменная указывающая, использовать ли //первую строку, в качестве заголовков для //столбцов. bool IsFirstRowAsColumnNames = true; IDataObject dataInClipboard = Clipboard.GetDataObject(); string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text); char[] rowSplitter = < 'r', 'n' >; string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries); DataTable dt = new DataTable(); if (IsFirstRowAsColumnNames) < //В данном случае берется первая строка //и разделятся на отдельные части с помощью //класса Split. Данные помещаются в массив //после чего, циклом forech добавляются //заголовки столбцов string[] words = rowsInClipboard[0].Split('t'); foreach (string word in words) < dt.Columns.Add(word); >for (int i = 2; i > else < //Если в скопированных данных отсутствуют //заголовки для столбцов, то // автоматически пронумеровать их for (int colc = 1; colc for (int i = 1; i > dataGridView1.DataSource = dt;
Пример №5
Добавление данных вручную.
В первых трех примерах присутствует строка закрытия подключения к выбранному файлу. Например:
IEDR.Close(); con.Close(); app.Quit();
Данные строки кода необходимы для завершения процесса «EXCEL.EXE», каждый раз запускающегося при подключении к выбранному файлу. При отсутствии данного кода, количество процессов с каждым открытым файлом будет возрастать, что может привести к сбоям в работе операционной системы.

Вы так же можете самостоятельно рассмотреть и другие компоненты по работе с файлами Microsoft Excel, например библиотеки от «GemBoxSoftware».
Ссылка для скачивания примера: Яндекс.Диск
Ссылка для скачивания библиотеки Excel Data Reader: Яндекс.Диск
Экспорт данных из файла Excel в DataGridView
Экспорт данных из datagridview в Excel
Всем привет! Может кто-нибудь подсказать как сделать "Экспорт данных их datagridview в Exel", то.
Экспорт данных из Excel-я в DataGridView
Здравствуйте друзья Как реализовать экспорт данных из экзеля в datagridview.

Экспорт данных в Excel из DataGridView
Экспорт данных в Excel из DataGridView. Как это делается помогите пожалуйста? Из БД Экспорт.
Экспорт данных из DataGridView в Excel
Помогите пожалуйста, я экспортировала данные из datagridview в эксель, затем по этим данным в.
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
Igora16011977, советую обратить внимание на 22 строку кода, а именно запросу к екселю. Он капец какой ужасный. Используйте конечное и четкое обозначение того, что хотите тянуть.
Есть подозрение, что названия столбцов не совпадают с названиями полей в гриде. Имеет значение также и регистр у названия полей. Можно использовать алиасы в запросе select-а.
Регистрация: 12.01.2018
Сообщений: 6
Я только учусь. Данные формируются в DataGridView, после формирования сохраняются в Excel файле. При обратной операции (загрузка файла Excel в DataGridView) к таблице добавляется аналогичная (справа от основной), но уже с нужными данными. Помогите
Добавлено через 5 минут
Я только учусь. Данные формируются в DataGridView, после формирования сохраняются в Excel файле. При обратной операции (загрузка файла Excel в DataGridView) к таблице добавляется аналогичная (справа от основной), но уже с нужными данными. Помогите
Добавлено через 1 час 49 минут
АУ. Помогите
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
Igora16011977, Ничего не понятно.
Давайте уж тогда хоть скрины.
И в чем сакральный смысл отправлять туда-сюда? Научится - хорошо - смотрте дебагером что творится в таблице, что указана в коде как
DataTable dt = ds.Tables[0];
И как она отличается от той, что была создана ранее.
Регистрация: 12.01.2018
Сообщений: 6
Данные заносятся в DataGridView. После этого экспортируются в EXCEL.
Если нужно внести изменения - загружаю назад, правлю.
Две таблицы идентичны - только одна возле другой.
Регистрация: 12.01.2018
Сообщений: 6
Кроме того, на ВСЕМ интернет пространстве нет нормального рабочего кода для загрузки данных с листа Excel в DataGridView. А вопросов по теме много
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
Igora16011977,
Сообщение от hoolygan 
как она отличается от той, что была создана ранее
Я же не зря задал этот вопрос.
Код для загрузки с екселя вполне себе правильный, лучше можно сделать - но для небольших файлов это будет экономия на спичках. Но я так понимаю, что не потрудились вместо
SELECT * FROM
прописать правильный текст запроса на подобии
SELECT col1 AS FieldName1, col2 AS FileldName2. FROM.
Ну и после этого посмотреть в дебагере 2 таблицы dt, и сравнить их.
То, что у Вас в гриде поля прописаны - то лично Ваши проблемы, они НИКАКОГО отношения к ТАБЛИЦЕ не имеют, и не должны иметь - грид это всего-навсего визуальный инструмент для отображения этих данных.
Хотите, чтобы помогли - давайте данные в сыром виде, а не в контролах.
Как загрузить готовую таблицу excel в datagridview
Подскажите пожалуйста, есть ли у кого примеры использования контрола DataGrid.
В интернете покопался и к сожалению нет информации.
Хочу таблицу с листа отобразить на форме.
Пользователь
Сообщений: 4663 Регистрация: 11.06.2014
Microsoft MVP 2018-2022
10.09.2014 12:36:50
| Цитата |
|---|
| ac1-caesar пишет: В интернете покопался и к сожалению нет информации. |
In VBA you do not have DataGrid, but You can use Listbox from standard control or CC controls from mscomctl.ocx named ListView Control.
You can add it using Toolbox: (right click)
Important is reference in your system.
If you'll any problems, you should use regsvr32.exe to register control.
F1 творит чудеса
Пользователь
Сообщений: 633 Регистрация: 26.02.2014
10.09.2014 12:41:27
datagrid не использовал, а flexgrid да.
обращение к нему довольно простое
статический
загрузка, чтение
fg.TextMatrix(0,0) 'индексация с начинается с 0
ado
загрузка
rs - recordset с набором данных
fg.DataSource = rs
Пользователь
Сообщений: 471 Регистрация: 25.07.2013
10.09.2014 15:53:26
B.Key, посмотрите как сделал в flexgrid.
Заполнил из таблицы листа "AD_EVALUATION_STATUS". Но вопрос в следующем: как задать ширину колонки и высоту строки по содержанию текста? И текст в ячейках чтобы имел перенос, а не в одну строчку.
Может подскажете решение проще?
Прикрепленные файлы
- AD-CN EVALUATION COMPLIANCE REPORT FORM.rar (93.44 КБ)
Изменено: ac1-caesar - 10.09.2014 16:25:48
Пользователь
Сообщений: 633 Регистрация: 26.02.2014
10.09.2014 18:11:10
В данный момент посмотреть не смогу, не установлены данные компоненты
Пользователь
Сообщений: 471 Регистрация: 25.07.2013
10.09.2014 18:54:08
Перенос строк нашел в свойствах WordWrap = True.
Пытаюсь задать ширину колонки
With Me.MSFlexGrid1 .ColWidth(0) = 1700: .ColWidth(1) = 1800: .ColWidth(2) = 1200 .ColWidth(3) = 1700: .ColWidth(4) = 1700: .ColWidth(5) = 1700 .ColWidth(6) = 1700: .ColWidth(7) = 1400: .ColWidth(8) = 1900 .ColWidth(9) = 1700: .ColWidth(10) = 1700: .ColWidth(11) = 1700 .ColWidth(12) = 2000: .ColWidth(13) = 1700: .ColWidth(14) = 2000 .ColWidth(15) = 1700: .ColWidth(16) = 1500: .ColWidth(17) = 3000 .ColWidth(18) = 1500: .ColWidth(19) = 1500 End With
Однако больше трех колонок задать не получается.
И не понятно как сделать высоту строки по содержанию??
Статья C# Экспорт данных из DataGridView в Excel файл
В этой статье хочу показать на простом примере, как с помощью языка c# можно выполнить экспорт данных из DataGridView в Excel файл.
И так для начала создадим Windows Forms приложение на языке csharp, после чего добавим на форму два элемента управления: DataGridView (dgv) и кнопку с надписью: Экспорт в Excel.
Подготовка
И так для начала создадим метод 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)
Нажимаем F5 или Ctrl+F5 и получаем следующий результат.
Экспорт в Excel
Первый этап закончен. Теперь переходим ко второму этапу, который так же начнётся с создания метода. И так, для начала создадим метод ExportToExcel. С помощью него, как думаю не трудно догадаться, мы собственно и будем выполнять экспорт данных в Excel файл.
private void ExportToExcel()
Для работы с Excel нам понадобиться добавить в проект сборку: Microsoft.Office.Interop.Excel.
Чтобы каждый раз не обращаться к членам и типам данной сборки, используя полные имена, добавим следующую строку:
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()
Конфликта больше нет и теперь можно работать дальше.
И так, чтобы выполнить экспорт данных в excel файл нам понадобиться для начала создать объект класса Application. Здесь так же возникает конфликт имен, поэтому в данном примере я создам ещё один псевдоним, но Вы можете просто указать полное имя:
using Excel = Microsoft.Office.Interop.Excel;
Затем внутри метода 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, "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 текущего проекта.
И в конце завершаем работу с Microsoft Excel.
exApp.Quit();
Нам осталось выполнить последний шаг. В событие Button.Click поместим метод ExportToExcel.
private void button1_Click(object sender, EventArgs e)
На этом экспорт завершен, окончательный результат можно увидеть на картинке ниже.
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("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.
- Определение дня недели по дате
- Поиск html элемента с атрибутом id
- c# Работа с TreeView. Часть 2
Pirnazar
Well-known member
Green Team
- Сообщения 205
- Реакции 335
The Codeby
Well-known member
30.12.2015 4 656 6 538
Комментарии, перенесенные из блога
АЛЕКСАНДР
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 > 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
Спасибо, со временем теперь все норм), жаль что я так и не успел разобрать с выборкой…
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
ВИКТОРИЯ
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 строк, то это уже очень долго — минут 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) — любые. Если используем ProgressBar, то подаём b>=pgb.Minimum e В теле функции я pgb.Minimum и pgb.Maximum не трогаю намеренно, потому что подразумевается, что работа функции export2excel выполняет только часть процесса, например
pgb.Minimum = 0 pgb.Maximum = 100 pgb.Value = 0 получаем таблицу DataTable t — и пусть это будет 30% pgb.Value = 30 export2excel(t, pgb, 30, 100) — 'экспорт в эксель займёт оставшиеся 30-70%
ЭЛЬВИРА
17.10.2015 в 19:11
Не удалось получить фабрику класса COM для компонента с CLSID из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Ругается на первой же строчке
ЭЛЬВИРА
19.10.2015 в 08:14
Подскажите пожалуйста, можно ли не создавать новый файл, а записывать данные уже в заранее подготовленный шаблон. Т.е. у меня в exel есть формулы и мне только нужно, чтобы программа обновляла поля, загруженные из DataGridView.
ЭЛЬВИРА
19.10.2015 в 17:24
Извините, все проблемы решила
ADMIN
21.10.2015 в 05:50
Подскажите пожалуйста, можно ли не создавать новый файл, а записывать данные уже в заранее подготовленный шаблон
Можно — это ведь обычный файл.
СЕРЖ
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. Открывается не только мой файл но и еще пустая книга. Как ее убрать?