Как загрузить готовую таблицу excel в datagridview
Перейти к содержимому

Как загрузить готовую таблицу excel в datagridview

  • автор:

Загрузка данных из 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» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете пункт «Свойства».

Установите следующие параметры в свойствах компонента:

  • DockNone – свойство задает границы элемента управления, прикрепленные к его родительскому элементу управления и определяет способ изменения его размеров относительно родительского элемента управления. http://msdn.microsoft.com
  • AnchorTop, 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.

29831

Подготовка
И так для начала создадим метод 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 и получаем следующий результат.

29832

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

private void ExportToExcel()

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

29833

29834

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

using Microsoft.Office.Interop.Excel;

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

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

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

29835

После чего в исходном коде перед именем класса 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();

29836

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

Worksheet workSheet = (Worksheet)exApp.ActiveSheet;

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

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

29837

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

Экспортируем данные из 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 текущего проекта.

29838

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

exApp.Quit();

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

private void button1_Click(object sender, EventArgs e)

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

29839

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. Открывается не только мой файл но и еще пустая книга. Как ее убрать?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *