Как подключить excel к datagridview
У меня есть данные, которые я беру с листа Excel с конечной целью отображения в DataGridView.
В настоящее время я просто просматриваю UsedRange данных Excel и подключаю его к datagridview. Это работает нормально, но может увязнуть, когда имеется более 100 строк данных.
Я также играл с переходом от Excel к набору данных (используя тот же расточительный метод), и, как и ожидалось, загрузка данных занимает примерно такое же время.
Мне было интересно, есть ли у кого-нибудь информация о лучшем способе? Может быть, использовать XML из файла Excel?
EDIT:
Некоторая дополнительная информация:
Это приложение WinForms, и пользователь будет выбирать и загружать файл Excel во время выполнения.
РЕДАКТИРОВАТЬ
Возвращение некоторой дополнительной информации:
Файл Excel находится на компьютере пользователя. Общее предположение состоит в том, что они будут загружать разные файлы каждый раз, когда будут использовать приложение. [не уверен, что это поможет, но было бы полезно знать :)]
задан 28 июля '10, 13:07
3 ответы
Недавно я столкнулся с такой же проблемой . Я не смог найти готовое решение, которое сделало бы это за меня, поэтому в итоге я написал код вручную.
На самом деле у меня есть два разных решения в моей библиотеке кода: одно использует OLEDB, а другое - Excel Interop. Судя по вашему вопросу, я предполагаю, что вы пытались использовать решение для взаимодействия, и оно слишком медленное. Если все, что вам нужно, - это читать таблицы непосредственно из Excel, где на каждый лист приходится по одной таблице, решение OLEDB, вероятно, будет чище и быстрее. Если вы когда-нибудь дойдете до точки, когда вам нужно будет записать файл Excel, вы можете обнаружить, что OLEDB слишком ограничен. Это был мой опыт для одного проекта.
В любом случае, я опубликую несколько фрагментов из моего решения OLEDB, которые, надеюсь, помогут вам начать работу:
Вот код для ExcelConnectionProvider :
Если вы столкнетесь с какими-либо проблемами при этой компиляции, попробуйте включить сборку «System.Data.DataSetExtensions» в свой проект.
EDIT: : IConnectionProvider не нужен - это интерфейс, который я добавил в свою библиотеку, потому что у меня есть другие поставщики соединений, помимо Excel.
Before we start, make sure that you have Visual Studio installed on your machine. If not, you can visit this download link. You can download the community version for free.
Let’s Start:
2. From the New Project window. Name your project in any way you want. In my case, I name my project Upload_Data_From_Excel. Proceed on clicking the “Ok” button. See the image below.
3. Add controls from the toolbox. What we need is a Form, buttons, and OpenFileDialog.
- Form
- Button -> for the upload click event.
- OpenFileDialog -> for browsing files.
- DataGridview ->for viewing of data
Below image is the UI I created. This will help you visualize and understand the next step.
- For clarity and easy navigating, we will rename our button. Click the button you added to your form and go to its property from the solution explorer and change the value. In my case, I name it as btn_Upload.
Change button name
5. Now navigate to your solution explorer and right-click on Reference, choose Add Reference, and then add Microsoft.Office.Interop.Excel.
Add Reference
6. From the reference manager window, expand Assemblies, and click Extensions from the left pane and search for Microsoft.Office.Interop.Excel from the middle pane.
Add Microsoft Office Interop
7. Verify if the reference is added. Go to your project solution explorer. Expand Reference, then look for Microsoft.Office.Interop.Excel.
Check Reference if Added
8. After we verify and successfully added Microsoft.Office.Interop.Excel. Open your form design and double click on the btn_Upload button to add button click event.
Double Click on button upload
9. Copy and paste the code below to your btn_Upload Click Event.
Final output:
Excel File:
Excel File
Project Output:
Final Output
Full Code:
Thank you for reading! Happy Coding!!
В данной инструкции рассмотрены 5ть примеров реализации получения данных из файла Microsoft Excel 2003-2007.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на форму три компонента:
-
textBox1 — в данном компоненте будет выводится путь, имя и расширение выбранного файла;
Выберете компонент «dataGridView1» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете пункт «Свойства».
Пример №1
В данном примере рассмотрено использование функций приложения Microsoft Office Excel из пакета Microsoft Office, c использованием библиотеки объектов Microsoft Excel 14. Данная библиотека позволяет управляемому коду взаимодействовать с объектной моделью приложения Microsoft Office, основанной на модели COM. Сделайте двойной клик по компоненту «button1», вы перейдете в автоматически созданный метод «button1_Click», события компонента «Click».
Перейдите в «Обозреватель решений» и найдите группу «References» которая содержит все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».
У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.
Выберете группу «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.
В коде присутствует проверка, что пользователь действительно выбрал файл, если данное условие выполнено, в текстовое поле с помощью свойства «FileName», класса «OpenFileDialog» помещается путь, имя и расширение выбранного файла в элемент управления «textBox1».
Для открытия существующего документа используется метод «Open» из набора «Excel.Workbooks», в качестве основного параметра указывается путь к файлу, остальные параметры остаются пустыми.
Полный список параметров метода «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.
После получения объекта «Range», с помощью цикла «For» загружается первая строка из таблицы и каждое значение устанавливается в качестве имени колонки таблицы.
Далее таким же способом загружаются все оставшиеся строки с добавлением в таблицу.
По завершении загрузки данных с указанного листа, сформированная таблица «dt» подключается к элементу управления «dataGridView1». Так же открытый объект «Application» или приложение «Excel» закрывается.
Полный листинг рассмотренного кода, приведен ниже, добавьте его в метод «button1_Click» компонента «button1».
Пример №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»
После получения таблицы с листами, получаем название первого листа, для создания sql запроса к файлу. Изменяя значение «Rows», вы изменяете, номер листа в книге, к которому будет выполнен запрос.
Далее при помощи класса «OleDbDataAdapter» и его метода «Fill» данные загружаются в Dataset – «ds».
Полный листинг примера приведен ниже.
Скачайте данный компонент и перейдите в обозреватель решений. Найдите группу «References», в которой содержатся все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».
Выберете группу «Обзор», данная группа позволяет вам осуществить поиск компонента в файловой системе. Нажмите на кнопку «Обзор…», расположенную в нижней части окна менеджера ссылок.
У вас откроется окно с заголовком «Выберете файлы, на которые нужно установить ссылки», перейдите в директорию со скачанными библиотеками. Данные библиотеки находятся в архиве «WinRar», распакуйте его. В папке с распакованным архивом вы увидите две директории:
После добавления библиотек, вы увидите их название, и путь к ним в центральной части окна менеджера ссылок. Так же напротив каждой из них будет установлена галочка, это означает, что в проект будут добавлены ссылки на обе библиотеки. В левой части окна будет выведено описание библиотек, это «Имя», «Автор» и «Версия файла». Нажмите на кнопку «ОК», расположенную в нижней части окна менеджера.
После добавления ссылок на библиотеки, у вас появится два новых пункта в обозревателе решений.
Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму элемент управления «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button3_Click», события компонента «Click». Добавьте приведенный ниже листинг в тело данного метода.
В данном примере рассмотрен листинг реализующий вставку данных скопированных в буфер обмена из файла Excel. Для получения данных из буфера обмена используется класс «Clipboard» с использованием его метода «GetDataObject», который извлекает данные находящиеся в данный момент, в системном буфере обмена. Во избежание ошибок с форматом получаемых данных, используется интерфейс «IDataObject», который предоставляет не зависящий от формата, механизм передачи данных.
Более подробно ознакомиться с классом «Clipboard», вы можете на сайте Microsoft MSDN.
Так как в буфере обмена, все данные содержаться в виде одной строки и их необходимо разбить на массив данных.
Данную задачу решает метод «String.Split». Метод возвращает строковый массив, содержащий подстроки разделенные элементами «r» — возврат каретки и «n» — перевод строки.
Полученный массив строк содержит «t» — знак горизонтальной табуляции, который разделят значения ячеек. Для добавления столбцов с заголовками (если такая строка скопирована в буфер обмена), необходимо взять из массива первый элемент и с использованием метода «String.Split» разбить на новый массив, указав в качестве элемента разделения знак горизонтальной табуляции — «t».
Далее необходимо с помощью цикла «foreach» пройти по всему массиву и добавить новые колонки с указанием в качестве имени полученное значение.
После получения всех данных из буфера обмена и заполнения таблицы «dt», она устанавливается в качестве источника данных элементу управления «dataGridView1». Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму компонент «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button4_Click», события компонента «Click». Добавьте приведенный ниже полный листинг в тело данного метода.
Пример №5
Добавление данных вручную.
В первых трех примерах присутствует строка закрытия подключения к выбранному файлу. Например:
Данные строки кода необходимы для завершения процесса «EXCEL.EXE», каждый раз запускающегося при подключении к выбранному файлу. При отсутствии данного кода, количество процессов с каждым открытым файлом будет возрастать, что может привести к сбоям в работе операционной системы.
Вы так же можете самостоятельно рассмотреть и другие компоненты по работе с файлами Microsoft Excel, например библиотеки от «GemBoxSoftware».
EasyXLS™ library allows you to import Excel data to DataGridView. The data can be imported from an Excel sheet or from the active Excel sheet. The entire sheet data or only data from ranges of cells can be imported.
EasyXLS can be successfully used to also import large Excel files having big volume of data with fast importing time.
EasyXLS permits you to import Excel files without Excel installed, without OLEDB, without Interop or any other additional software installed.
Table of contents
Source code sample
To download the trial version of EasyXLS Excel Library, press the below button:
If you already own a license key, you may login and download EasyXLS from your account.
Step 3: Include EasyXLS library into project
EasyXLS.dll must be added as reference to your project. EasyXLS.dll can be found after installing EasyXLS, in "Dot NET version" folder.
Import Excel cell formatting to DataGridView
Importing also the cell formatting requires some changes to previous code in order to import not only data from the Excel file, but also the cell formatting styles. See below how the source code must be adjusted:
Source code sample
EasyXLS also offers some open source code that imports an Excel file to a GridView. The code shows how to import all cell data and formatting, conditional formatting and the charts.
See also:
Import Excel to GridView (Download open source code)
How to format Excel cells?
Import Excel file having one sheet to DataGridView
Importing the Excel file data to DataGridView, if the Excel file has only one sheet, is the easiest approach. The Excel data can be imported with one single line of code using:
- ExcelDocument. easy_ReadXLSXActiveSheet_AsDataSet method for XLSX file
- ExcelDocument. easy_ReadXLSBActiveSheet_AsDataSet method for XLSB file
- ExcelDocument. easy_ReadXLSActiveSheet_AsDataSet method for XLS file
The first code sample shows how to achieve this goal.
Import Excel file having multiple sheets to DataGridView
There are three approaches for importing data from an Excel file with multiple sheets.
I. Usually the first sheet is the active sheet inside an Excel file. If this is your case or if you are importing data from another active sheet use:
- ExcelDocument. easy_ReadXLSXActiveSheet_AsDataSet method for XLSX file
- ExcelDocument. easy_ReadXLSBActiveSheet_AsDataSet method for XLSB file
- ExcelDocument. easy_ReadXLSActiveSheet_AsDataSet method for XLS file
II. For importing data from an Excel sheet and the name of the sheet is known, EasyXLS recommends the use of:
- ExcelDocument. easy_ReadXLSXSheet_AsDataSet method for XLSX file
- ExcelDocument. easy_ReadXLSBSheet_AsDataSet method for XLSB file
- ExcelDocument. easy_ReadXLSSheet_AsDataSet method for XLS file
III. For importing data from an Excel sheet and the name of the sheet is not known, the first step is to find the sheet by reading the Excel file using:
- ExcelDocument.easy_LoadXLSXFile method for XLSX file
- ExcelDocument.easy_LoadXLSBFile method for XLSB file
- ExcelDocument.easy_LoadXLSFile method for XLS file
Then, import the sheet data in DataGridView using ExcelDocument. easy_ReadExcelWorksheet_AsDataSet method.
Import range of Excel cells to DataGridView
EasyXLS enables you to import Excel data to DataGridView either from the entire sheet or from a range of cells. Importing only a range of cells is a very useful option especially for large Excel files because it reduces the speed of the import process.
In order to import multiple cell ranges at once from Excel sheet, the range parameter must be passed to the method as union of ranges (multiple ranges separated by comma).
All the methods that allow importing Excel to DataSet have parameters that permit importing only ranges of cells.
Following are the steps to Import Excel File to DataGrid in WPF
- ADD CONTROLS IN XAML PAGE
- ADD XAML CODE FOR LAYOUT
- ADD CODE-BEHIND CODE
- RUN PROJECT AND CHECK FINAL OUTPUT
ADD CONTROLS IN XAML PAGE
Drag and drop below controls in design surface.
- Textbox control
- Two button controls
- Label control
- DataGrid control
ADD XAML CODE FOR LAYOUT
ADD CODE-BEHIND CODE
RUN PROJECT AND CHECK FINAL OUTPUT
Source Code
RELATED ARTICLESMORE FROM AUTHOR
WPF Touch Screen Keyboard
Windows Forms Controls in WPF
Single Instance WPF Application
Rating Control in WPF
Menu Control in WPF
Sliding Panel in WPF
18 COMMENTS
Heya i’m for the first time here. I came across
this board and I find It really useful & it helped
me out much. I hope to give something back and aid others
like you aided me.
Hello there I am so grateful I found your blog, I
really found you by error, while I was looking on Digg for something
else, Nonetheless I am here now and would just like to say thanks
a lot for a incredible post and a all round exciting
blog (I also love the theme/design), I don’t have time to read it all at the
moment but I have book-marked it and also included
your RSS feeds, so when I have time I will be back to read
a lot more, Please do keep up the excellent b.
There is definately a lot to learn about this subject. I really like all the points you’ve made.
in WPF only I need to establish connection with SQL Express database.mdf through the path in app.config file
using System;
using System.Configuration;
using System.Data.SqlClient;
and add in references … System.Configuration.dll
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
FillDataGrid();
>
private void FillDataGrid()
String ConString = ConfigurationManager.ConnectionStrings[“ConString”].ConnectionString;
String CmdString = String.Empty;
using (SqlConnection con = new SqlConnection(ConString))
CmdString = “Select BookID, BookTitle, AuthorID from dbo.Table_1_Books”;
SqlCommand cmd = new SqlCommand(CmdString, con);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable(“Books”);
sda.Fill(dt);
DataGrid_Loaded.ItemsSource = dt.DefaultView;
>
>
>
the error is from
ConfigurationManager.ConnectionStrings[“ConString”].ConnectionString in wpf in vs 2013
can’t fill data
please I need zip file with sample wpf datagrid using ConfigurationManager in sql database with vs 2013
Can you please add the System.Configuration reference to your project.
I can’t get images while using this code…can u plz reply how to import images from excel file??thanks
You can’t directly retrieve image using the Excel Office interop. You have to send the image to clipboard and then get from there.
You can try to check the following code.
Excel.Picture pic = (Excel.Picture)CurSheet.Pictures(1);
pic.Copy();
IDataObject data = Clipboard.GetDataObject();
Image pic2 = (Image)data.GetData(DataFormats.Bitmap, true);
pic2.Save("pic.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
Hope this will help you..
Thanks!
I m trying this code,but “pic2.Save(“pic.jpg”, System.Drawing.Imaging.ImageFormat.Jpeg);” this line comes error..the error line is “system.windows.controls.image does not contain a definition for save”…..plz help me…
thanks in advance!!
Hello aravindh,
Can you please check namespace and reference related to image control.
Thanks!
I had used these code. I have a error .
ERROR- Unable to cast object of type ‘System.Windows.Interop.InteropBitmap’ to type ‘System.Drawing.Image’. at ReadExcel_And_BindToDataGrid.MainWindow.btnOpen_Click(Object sender, RoutedEventArgs e) in j:\projects\dpIm\files\excel.xaml.cs:line 62
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;
using System.Data;
using WpfApplication1;
using System.Drawing;
namespace ReadExcel_And_BindToDataGrid
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
//new Class1();
private void btnOpen_Click(object sender, RoutedEventArgs e)
try
OpenFileDialog openfile = new OpenFileDialog();
openfile.DefaultExt = “.xls”;
openfile.Filter = “(.xls)|*.xls”;
//openfile.ShowDialog();
var browsefile = openfile.ShowDialog();
if (browsefile == true)
txtFilePath.Text = openfile.FileName;
Microsoft.Office.Interop.Excel.Picture pic = (Microsoft.Office.Interop.Excel.Picture)excelSheet.Pictures(1);
pic.Copy();
IDataObject data = Clipboard.GetDataObject();
System.Drawing.Image pic2 = (System.Drawing.Image)data.GetData(DataFormats.Bitmap, true);
pic2.Save(“pic.jpg”, System.Drawing.Imaging.ImageFormat.Jpeg);
string strCellData = “”;
double douCellData;
int rowCnt = 0;
int colCnt = 0;
DataTable dt = new DataTable();
for (colCnt = 1; colCnt string strColumn = "";
strColumn = (string)(excelRange.Cells[1, colCnt] as Microsoft.Office.Interop.Excel.Range).Value2;
dt.Columns.Add(strColumn, typeof(string));
>
for (rowCnt = 2; rowCnt string strData = "";
for (colCnt = 1; colCnt try
strCellData = (string)(excelRange.Cells[rowCnt, colCnt] as Microsoft.Office.Interop.Excel.Range).Value2;
strData += strCellData + "|";
>
catch (Exception ex)
MessageBox.Show(ex.Message + ex.StackTrace);
douCellData = (excelRange.Cells[rowCnt, colCnt] as Microsoft.Office.Interop.Excel.Range).Value2;
strData += douCellData.ToString() + "|";
>
>
strData = strData.Remove(strData.Length – 1, 1);
dt.Rows.Add(strData.Split('|'));
excelBook.Close(true, null, null);
excelApp.Quit();
>
>
catch (Exception exx)
MessageBox.Show(exx.Message + exx.StackTrace);
>
>
private void btnClose_Click(object sender, RoutedEventArgs e)
this.Close();
>
Ok
We will check it and come back to you with new article.
As soon as possible please provide the correct solution sir, I need to import excel sheet and add that value in grid or list view ,that sheet contain both text and images.
You can import them to array and use as you want.
Cool, solution man ! Thanks a lot. I couldn’t find this anywhere in official supports and documentations. Everything works correctly!
You can use ZetExcel for empowering you to build cross-platform applications having the ability to generate, modify, convert, render and print spreadsheets without using Microsoft Excel.
Читайте также: