Поиск на сайте
Главная Журнал Форум Wiki DRKB Страны мира

Из Excel в DataGrid

Эта статья демонстрирует простой способ, как получить доступ к данным, скопированным из листа Microsoft Excel и поместить их на форму в DataGrid. Многие пользователи традиционно используют Excel в качестве примитивного хранилища и, по-привычке, пытаются копировать данные из экселя в другое приложение. Данный пример является хорошей отправной точкой для решения подобных потребностей.

Для начала сгруппируем основные этапы задачи извлечения скопированных данных из буфера обмена:

• Доступ и извлечение данных из буфера обмена
• Форматирование данных перед помещением их в DataGrid
• Связывание данных с элементом управления DataGrid

Во-первых, полезно будет слегка разобраться с терминами, используемыми в данном примере:

• Буфер обмена: тут всё понятно. В .NET для этого есть специальный класс, который так и называется Clipboard. Его-то мы и будем использовать для извлечения данных из буфера обмена.
• IDataObject: Этот интерфейс обеспечивает формато-независимый механизм для передачи данных. Мы его так же будем использовать для извлечения и сохранения данных, скопированных из экселя в буфер обмена.
• DataFormats: этот класс содержит предопределённые имена форматов, которые буфер обмена может хранить в себе (значения, разделенные запятыми, Html, Bitmap, и так далее). DataFormats поможет нам идентифицировать данные экселя, полученные в IDataObject.

Доступ и извлечение данных буфера обмена

Итак, заглянем в буфер обмена и распакуем его содержимое в объект-контейнер. Для этого воспользуемся методом GetDataObject класса Clipboard и поместим содержимое в IDataObject:

Dim objPresumablyExcel As IDataObject = Clipboard.GetDataObject()

Теперь проверим, действительно ли содержимое буфера обмена принадлежит экселю. Данные, скопированные из Excel помещаются в буфер обмена в виде значений, разделённых запятыми и символом окончания строки между двумя строками данных. Поэтому, для проверки, воспользуемся методом GetDataPresent объекта IDataObject, передав ему в качестве параметра значение CommaSeperatedValue класса DataFormats.

If (objPresumablyExcel.GetDataPresent(DataFormats. _
   CommaSeparatedValue)) Then
   ...
   ...
   ...
End If

Форматирование данных перед помещением их в DataGrid

Для форматирования "сырых" данных воспользуемся объектом DataTable, который впоследствие будет привязан к DataGrid.

Dim tblExcel2WinData As New DataTable

Преобразовать данным можно многими способами. В качестве примера, сбросим содержимое IDataObject в поток данных (объект класса StreamReader):

Dim srReadExcel As New StreamReader(CType(objPresumablyExcel. _
    GetData(DataFormats.CommaSeparatedValue), Stream))

Далее будем в цикле считывать данные построчно:

While (srReadExcel.Peek() > 0)
   ...
   ...
   ...
End While

Внутри цикла каждая считанная строка из объекта StreamReader будет помещаться в объект DataTable. Промежуточно будем помещать считанную строку в переменную типа String:

Dim sFormattedData As String
 
sFormattedData = srReadExcel.ReadLine()

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

Dim arrSplitData As Array
 
arrSplitData = sFormattedData.Split(",")

Количество элементов массива эквивалентно числу столбцов данных, скопированных из листа Excel. Добавим в DataTable такое же количество столбцов:

If tblExcel2WinData.Columns.Count <= 0 Then
   For iLoopCounter = 0 To arrSplitData.GetUpperBound(0)
      tblExcel2WinData.Columns.Add()
   Next
End If

Наконец, в цикле пройдёмся по массиву, чтобы добавить содержимое отдельных ячеек в строку DataTable и добавим строку в DataTable:

Dim iLoopCounter As Integer
Dim rowNew As DataRow
 
rowNew = tblExcel2WinData.NewRow()
 
For iLoopCounter = 0 To arrSplitData.GetUpperBound(0)
   rowNew(iLoopCounter) = arrSplitData.GetValue(iLoopCounter)
Next
 
tblExcel2WinData.Rows.Add(rowNew)

Привязка данных к DataGrid

The copied Excel Sheet data is successfully replicated and contained in the DataTable object. Скопированые данные с листа Excel успешно помещены в объект DataTable. Теперь остаётся связать объект DataTable с DataGrid:

dgrExcelContents.DataSource = tblExcel2WinData.DefaultView()

И, вуаля, данные из листа Excel волшебно появились в DataGrid!

Скачать исходник примера - 6 кб




Основные разделы сайта


 

Реклама Купить диплом
Купить диплом