DataGridView1.Columns.Add(); exception
Здравствуйте. Си шарп не изучал. Изучал (и продолжаю) Джава и (в молодости было) Делфи. Поставил вижуал студию, хотел для саморазвития попробовать запилить блокнотик (с колоночками и строками а-ля эксель) для собственных нужд. Бегло глянул что и как, понял что синтаксис такой же как в джаве по большей части.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.Size = new Size(600, 600); TabControl tab = new TabControl(); tab.Location = new System.Drawing.Point(5, 5); tab.Size = new Size(350, 350); this.Controls.Add(tab); TabPage page1 = new TabPage("Page1"); page1.UseVisualStyleBackColor = true; TextBox textbox = new TextBox(); textbox.Name = ""; TabPage page2 = new TabPage("Page2"); page2.UseVisualStyleBackColor = true; tab.Controls.Add(page1); tab.Controls.Add(page2); // tab.TabPages.Add(page1); // tab.TabPages.Add(page2); } private void button1_Click(object sender, EventArgs e) { DataGridViewColumn col = new DataGridViewColumn(); col.HeaderText = "col1"; col.ReadOnly = true; dataGridView1.Columns.Add(col); } }
Загуглил какой компонент может для этого подойти, оказалось что DataGridView. Изначально создавал его динамически, но были при попытке создания колонки ловил эксепшены, думал, проблема в коде, по скольку язык новый. Решил попробовать просто тупо кинуть на форму. То же самое. Что бы я не делал — ловлю эксепшен на последней строке.
«An unhandled exception of type ‘System.InvalidOperationException’ occurred in System.Windows.Forms.dll
Additional information: Как минимум один из столбцов элемента управления DataGridView не имеет шаблона ячейки.»
Не понимаю как решить проблему. Буду очень благодарен за подсказку. Сильно пожалуйста не ругайтесь, я просто учусь. Знаю, что что бы что-то писать — надо учить и сейчас можете отправить это и делать, но хотелось бы немного конкретики, а именно о проблеме: Почему вылазит эксепшен, и как где я дурак?
Практическое руководство. Сокрытие столбцов элемента управления DataGridView в Windows Forms
Иногда требуется показать только некоторые из столбцов, доступных в элементе управления DataGridView Windows Forms. Например, руководителям может потребоваться показать столбец с заработной платой сотрудников, в то время как от других пользователей его нужно скрыть. Или может возникнуть необходимость привязать элемент управления к источнику данных, содержащему много столбцов, только часть из которых нужно показать. В этом случае столбцы, которые не следует показывать, обычно не скрываются, а удаляются.
В элементе управления DataGridView значение свойства Visible столбца определяет, будет ли этот столбец показан.
Как скрыть столбец программным образом
- Установите свойство DataGridViewColumn.Visible в значение false . Чтобы скрыть столбец CustomerID , создаваемый автоматически во время привязки к данным, поместите приведенный ниже пример кода в обработчик событий DataBindingComplete.
this.dataGridView1.Columns["CustomerID"].Visible = false;
Me.dataGridView1.Columns("CustomerID").Visible = False
Компиляция кода
Для этого примера требуются:
- элемент управления DataGridView с именем dataGridView1 , содержащий столбец с именем CustomerID ;
- ссылки на сборки System и System.Windows.Forms.
См. также
- DataGridView
- DataGridViewColumn.Visible
- Базовые характеристики столбцов, строк и ячеек элемента управления DataGridView в Windows Forms
- Практическое руководство. Удаление автоматически сгенерированных столбцов элемента управления DataGridView в Windows Forms
- Практическое руководство. Изменение порядка столбцов элемента управления DataGridView в Windows Forms
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
.NET Desktop feedback
The .NET Desktop documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Типы столбцов элемента управления DataGridView в Windows Forms
Элемент управления DataGridView использует несколько типов столбцов для отображения сведений и предоставления пользователям возможности изменять или добавлять их.
При привязке элемента управления DataGridView и установке свойства AutoGenerateColumns столбцы true автоматически создаются с использованием типов столбцов по умолчанию, соответствующих типам данных, содержащимся в привязанном источнике данных.
Вы также можете создавать экземпляры любого класса столбцов самостоятельно и добавлять их в коллекцию, возвращаемую свойством Columns. Создаваемые таким образом экземпляры можно использовать в качестве непривязанных столбцов или привязать вручную. Привязанные вручную столбцы применяются, например, когда требуется заменить автоматически созданный столбец одного типа столбцом другого типа.
В следующей таблице описываются различные классы столбцов, доступные для использования в элементе управления DataGridView.
| Класс | Description |
|---|---|
| DataGridViewTextBoxColumn | Используется с текстовыми значениями. Создается автоматически при привязке к числовым значениям и строкам. |
| DataGridViewCheckBoxColumn | Используется со значениями Boolean и CheckState. Создается автоматически при привязке к значениям этих типов. |
| DataGridViewImageColumn | Используется для отображения изображений. Создается автоматически при привязке к массивам байтов, а также к объектам Image или Icon. |
| DataGridViewButtonColumn | Используется для отображения кнопок в ячейках. Не создается автоматически при привязке. Обычно используется в качестве непривязанных столбцов. |
| DataGridViewComboBoxColumn | Используется для отображения раскрывающихся списков в ячейках. Не создается автоматически при привязке. Обычно привязывается к данным вручную. |
| DataGridViewLinkColumn | Используется для отображения ссылок в ячейках. Не создается автоматически при привязке. Обычно привязывается к данным вручную. |
| Пользовательские типы столбцов | Вы можете создать собственный класс столбцов путем наследования от класса DataGridViewColumn или любого производного от него класса, чтобы самостоятельно задать внешний вид, поведение или размещаемые элементы управления. Дополнительные сведения см. в статье Практическое руководство. Дополнительные возможности управления внешним видом и поведением ячеек и столбцов элемента управления DataGridView в Windows Forms. |
Эти типы столбцов подробно описаны в следующих разделах.
DataGridViewTextBoxColumn
DataGridViewTextBoxColumn — это тип столбца общего назначения для использования с текстовыми значениями, такими как числа и строки. В режиме редактирования элемент управления TextBox отображается в активной ячейке, что позволяет пользователям изменять значение ячейки.
Для отображения значения ячеек автоматически преобразуются в строки. Введенные или измененные пользователем значения автоматически анализируются для создания значения ячейки соответствующего типа данных. Эти преобразования можно настроить, реализовав обработку событий CellFormatting и CellParsing элемента управления DataGridView.
Тип данных значения ячейки столбца указывается в свойстве ValueType столбца.
DataGridViewCheckBoxColumn
Элемент DataGridViewCheckBoxColumn используется со значениями Boolean и CheckState. Значения типа Boolean отображаются как флажки с двумя или тремя состояниями в зависимости от значения свойства ThreeState. Если столбец привязан к значениям типа CheckState, свойство ThreeState по умолчанию имеет значение true .
Как правило, значения ячеек с флажками предназначены либо для хранения данных любого вида, либо для выполнения массовых операций. Если вы хотите обеспечить немедленную реакцию при щелчке в ячейке с флажком, можно предусмотреть обработку события CellClick, однако необходимо учитывать, что это событие возникает до обновления значения ячейки. Если в момент щелчка вам требуется новое значение, в качестве варианта можно вычислить ожидаемое значение на основе текущего. Кроме того, можно немедленно зафиксировать изменение и обработать событие CellValueChanged для ответа. Чтобы зафиксировать изменение при щелчке в ячейке, необходимо обработать событие CurrentCellDirtyStateChanged. Если текущая ячейка содержит флажок, вызовите в обработчике метод CommitEdit и передайте в него значение Commit.
DataGridViewImageColumn
Элемент DataGridViewImageColumn используется для отображения изображений. Столбцы изображений можно заполнять автоматически из источника данных, вручную (для непривязанных столбцов) или динамически в обработчике события CellFormatting.
Для автоматического заполнения столбца изображений из источника данных поддерживаются массивы байтов изображений в различных форматах, включая все форматы, поддерживаемые классом Image, а также формат OLE Picture, используемый в Microsoft® Access и в образце базы данных Northwind.
Заполнение столбца изображений вручную применяется тех случаях, когда требуется реализовать функциональные возможности элемента DataGridViewButtonColumn с настраиваемым внешним видом. Для реакции на щелчки в ячейке с изображением можно предусмотреть обработку события DataGridView.CellClick.
Заполнение ячеек столбца изображений в обработчике события CellFormatting применяется в тех случаях, когда требуется предоставить изображения для вычисляемых значений или значений в форматах, отличных от изображений. Например, это может быть столбец «Risk» (Риск) со строковыми значениями, такими как «high» , «middle» и «low» , которые требуется отобразить в виде значков. Или это может быть столбец «Image» (Изображение), содержащий координаты изображений, которые необходимо загрузить, а не двоичное содержимое изображений.
DataGridViewButtonColumn
С помощью элемента DataGridViewButtonColumn можно отобразить столбец ячеек, содержащих кнопки. Такой подход применяется, если вы хотите предоставить пользователям простой способ выполнять действия с определенными записями, например размещать заказ или отображать дочерние записи в отдельном окне.
Столбцы кнопок не создаются автоматически при привязке данных к элементу управления DataGridView. Чтобы использовать столбцы кнопок, их необходимо создать вручную и добавить в коллекцию, возвращаемую свойством DataGridView.Columns.
Чтобы обеспечить реакцию на щелчки пользователя в ячейках с кнопками, необходимо предусмотреть обработку события DataGridView.CellClick.
DataGridViewComboBoxColumn
С помощью элемента DataGridViewComboBoxColumn можно отобразить столбец ячеек, содержащих раскрывающиеся списки. Такой элемент применяется для ввода данных в поля, которые могут содержать только определенные значения, как, например, в столбце «Category» (Категория) таблицы «Products» (Продукты) в образце базы данных Northwind.
Раскрывающиеся списки во всех ячейках можно заполнять так же, как и раскрывающийся список ComboBox: вручную с использованием коллекции, возвращаемой свойством Items, или посредством привязки к источнику данных с помощью свойств DataSource, DisplayMember и ValueMember. Дополнительные сведения см. в статье Элемент управления ComboBox.
Фактические значения ячеек можно привязать к источнику данных, используемому элементом управления DataGridView, задав свойство DataPropertyName элемента управления System.Windows.Forms.DataGridViewComboBoxColumn.
Столбцы полей со списком не создаются автоматически при привязке данных к элементу управления DataGridView. Чтобы использовать столбцы полей со списком, их необходимо создать вручную и добавить в коллекцию, возвращаемую свойством Columns.
DataGridViewLinkColumn
С помощью элемента DataGridViewLinkColumn можно отобразить столбец ячеек, содержащих гиперссылки. Этот элемент применяется для отображения значений URL-адресов в источнике данных или в качестве альтернативы столбцу кнопок для выполнения определенных действий, таких как открытие окна с дочерними записями.
Столбцы ссылок не создаются автоматически при привязке данных к элементу управления DataGridView. Чтобы использовать столбцы ссылок, их необходимо создать вручную и добавить в коллекцию, возвращаемую свойством Columns.
Чтобы обеспечить реакцию на щелчки пользователя по ссылкам, необходимо предусмотреть обработку события CellContentClick. Это событие отличается от событий CellClick и CellMouseClick, которые возникают, когда пользователь щелкает в любом месте ячейки.
Класс DataGridViewLinkColumn предоставляет несколько свойств для изменения внешнего вида ссылок до, во время и после того, как пользователь щелкнет их.
См. также
- DataGridView
- DataGridViewColumn
- DataGridViewButtonColumn
- DataGridViewCheckBoxColumn
- DataGridViewComboBoxColumn
- DataGridViewImageColumn
- DataGridViewTextBoxColumn
- DataGridViewLinkColumn
- Элемент управления DataGridView
- Практическое руководство. Вывод изображений в ячейках элемента управления DataGridView в Windows Forms
- Практическое руководство. Работа со столбцами изображений в элементе управления DataGridView в Windows Forms
- Настройка элементов управления DataGridView в Windows Forms
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
.NET Desktop feedback
The .NET Desktop documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Статья 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 667 6 558
Комментарии, перенесенные из блога
АЛЕКСАНДР
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. Открывается не только мой файл но и еще пустая книга. Как ее убрать?
