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

Экспорт DataGridView в Microsoft Excel

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

Итак, для начала, создадим новый проект. Всё, что нам нужно будет, это Кнопка (Button) и DataGridView.

Если Вам необходимо, чтобы перед экспортом приложение сперва считывало данные из файла, то понадобится объявить API функцию ShellExecute в классе формы. Иначе это делать необязательно.

    Private Declare Function ShellEx Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hWnd As Integer, ByVal lpOperation As String, _
        ByVal lpFile As String, ByVal lpParameters As String, _
        ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer

Теперь необходимо добавить процедуру, которая собственно и будет делать экспорт. Процедура будет создавать пустой файл и записывать в него с помощью класса StreamWriter. Как уже упоминалось выше, это будет всего лишь XML-документ. Наша процедура имеет 4 параметра: DataGridView, желаемое имя файла, расширение Excel и путь по которому будет создан файл. Обратите внимание, что Excel 2007 использует новое расширение файлов *.XLSX. При попытке открыть файл *.XLS в экселе 2007 года, вы получите следующее сообщение:

Просто нажмите кнопку "Yes".

Ниже преведена первая часть процедуры экспорта, создающая пустой файл и записывающая в него экселевские заголовки:

    Private Sub exportExcel(ByVal grdView As DataGridView, ByVal fileName As String, _
        ByVal fileExtension As String, ByVal filePath As String)
 
        ' Задаём путь, имя и расширение для экселевского файла
        Dim myFile As String = filePath & "\" & fileName & fileExtension
 
        ' Открываем файл и записываем в него заголовки
        Dim fs As New IO.StreamWriter(myFile, False)
        fs.WriteLine("<?xml version=""1.0""?>")
        fs.WriteLine("<?mso-application progid=""Excel.Sheet""?>")
        fs.WriteLine("<ss:Workbook xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"">")

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

        ' Создаём стили для таблицы
        fs.WriteLine("  <ss:Styles>")
        ' Стиль для заголовков колонок
        fs.WriteLine("    <ss:Style ss:ID=""1"">")
        fs.WriteLine("      <ss:Font ss:Bold=""1""/>")
        fs.WriteLine("      <ss:Alignment ss:Horizontal=""Center"" ss:Vertical=""Center"" " & _
            "ss:WrapText=""1""/>")
        fs.WriteLine("      <ss:Interior ss:Color=""#C0C0C0"" ss:Pattern=""Solid""/>")
        fs.WriteLine("    </ss:Style>")
        ' Стиль для информации в колонках
        fs.WriteLine("    <ss:Style ss:ID=""2"">")
        fs.WriteLine("      <ss:Alignment ss:Vertical=""Center"" ss:WrapText=""1""/>")
        fs.WriteLine("    </ss:Style>")
        fs.WriteLine("  </ss:Styles>")

Теперь надо создать собственно сам лист с данными:

        ' Записываем содержимое таблицы
        fs.WriteLine("<ss:Worksheet ss:Name=""Sheet1"">")
        fs.WriteLine("  <ss:Table>")
        For i As Integer = 0 To grdView.Columns.Count - 1
            fs.WriteLine(String.Format("    <ss:Column ss:Width=""{0}""/>", _
            grdView.Columns.Item(i).Width))
        Next
        fs.WriteLine("    <ss:Row>")
        For i As Integer = 0 To grdView.Columns.Count - 1
            fs.WriteLine(String.Format("      <ss:Cell ss:StyleID=""1"">" & _
                "<ss:Data ss:Type=""String"">{0}</ss:Data></ss:Cell>", _
                grdView.Columns.Item(i).HeaderText))
        Next
        fs.WriteLine("    </ss:Row>")
 
        ' В процессе добавления проверяем пустые строки
        Dim subtractBy As Integer, cellText As String
        If grdView.AllowUserToAddRows = True Then subtractBy = 2 Else subtractBy = 1
        ' Записываем содержимое каждой ячейки
        For i As Integer = 0 To grdView.RowCount - subtractBy
            fs.WriteLine(String.Format("    <ss:Row ss:Height=""{0}"">", _
                grdView.Rows(i).Height))
            For intCol As Integer = 0 To grdView.Columns.Count - 1
                cellText = grdView.Item(intCol, i).Value
                ' Проверяем null в ячейках и меняем его на empty чтобы не было ошибки
                If cellText = vbNullString Then cellText = ""
                fs.WriteLine(String.Format("      <ss:Cell ss:StyleID=""2"">" & _
                    "<ss:Data ss:Type=""String"">{0}</ss:Data></ss:Cell>", _
                    cellText.ToString))
            Next
            fs.WriteLine("    </ss:Row>")
        Next

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

        ' Закрываем документ
        fs.WriteLine("  </ss:Table>")
        fs.WriteLine("</ss:Worksheet>")
        fs.WriteLine("</ss:Workbook>")
        fs.Close()
 
        ' Открываем файл в Microsoft Excel
        ' 10 = SW_SHOWDEFAULT
        ShellEx(Me.Handle, "Open", myFile, "", "", 10)
    End Sub

Теперь, для экспорта в данных в Excel достаточно вызвать процедуру с соответствующими параметрами. Весь проект можно скачать в конце статьи.

    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        ' Вызываем процедуру экспорта
        exportExcel(DataGridView1, "exportedData", ".xlsx", _
            My.Computer.FileSystem.SpecialDirectories.Desktop)
    End Sub

Скачать демонстрационный проект - 112 кб




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


 

Реклама Компьютерная диагностика Опель Астра H, подробнее.