Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447

Загрузка Excel в DataGridView Windows10

13.10.2017, 14:44. Показов 2250. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли код ниже ускорить.
На компьютере уже стоит Windows10, Excel 2016 а код все старый использую:
VB.NET
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Private Sub LoadDataFromXL(ByVal iPath As String, ByVal iShtName As String)
        ' Взять данные из Excel
        Dim connectionString As String              '   Переменная для подключения базы
        Dim connection As OleDb.OleDbConnection     '   Переменная для запросов
 
        Try
            'Для Excel 12.0
            connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + iPath + "; Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
            connection = New OleDb.OleDbConnection(connectionString)
            connection.Open()
        Catch ex12 As Exception
            Try
                'Для более ранних версий Excel
                connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + iPath + "; Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
                connection = New OleDb.OleDbConnection(connectionString)
                connection.Open()                   '   Открываем соединение
            Catch ex11 As Exception
                MsgBox("Не знаю такой версии Excel")
                ' Return 0
            End Try
        End Try
 
        'Выборка данных
        Dim command As OleDb.OleDbCommand = connection.CreateCommand()
        command.CommandText = "Select * From [Лист1$]"
 
        Dim da As New OleDb.OleDbDataAdapter(command)           '   Через адаптер получаем результаты запроса
        da.Fill(dt)                                             '   Заполняем таблицу результатами
 
        With Me.DataGridView1
            .DataSource = dt
            
            .BorderStyle = BorderStyle.Fixed3D
            .EditMode = DataGridViewEditMode.EditOnEnter
            .AllowUserToOrderColumns = True         '   Возможность перетаскивать столбец
            .AllowUserToResizeColumns = True
            .AllowUserToAddRows = False
            .AutoResizeColumnHeadersHeight()
 
            '.Columns(0).Visible = False            '   Скрываем первый столбец
            .Columns(0).Width = 200                 '   Задаем ширину 1 столбца
            .Columns(0).ReadOnly = True             '   Делаем нередактируемый 1 столбец
            .Columns(1).Width = 50                  '   Задаем ширину 2 столбца 
            .Columns(2).Width = 50                  '   
 
            .Columns(3).Width = 50                  '   Задаем ширину 3 столбца 
            .Columns(4).Width = 50                  '   Задаем ширину 4 столбца 
            .Columns(5).Width = 70                  '   Задаем ширину 5 
            .Columns(6).Width = 50                  '   Разница старого с новым 
 
            .Columns(7).Width = 70                  '   Задаем ширину 6 В индексе'
            .Columns(8).Width = 40                  '   Разница старого с новым 
 
            .Columns(9).Width = 100                 '   Задаем ширину 7 
            .Columns(10).Width = 60                 '   Разница старого с новым
            .Columns(11).Width = 70                 '   Задаем ширину 11 до окончания домена
            .Columns(12).Width = 100                '   Задаем ширину 12 столбца дата обновления
 
            .Columns(13).Width = 50                 '   13 столбец регион сайта
            ' Выравнивание влево 1 столбца
            .Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
            ' Выравнивание по центру
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        End With
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2017, 14:44
Ответы с готовыми решениями:

Загрузка из Excel данных в DataGridView
Господа, программисты) уже голову сломал, не могу понять, почему не все данные загружаются в DGV, как только не баловался с HDR и IMEX,...

Загрузка файла Excel в DataGridView
Всем привет! Столкнулся с очень интересной задачей, у меня не получается загрузить файл good.xls в DGV, получилось лишь с открытым...

Повторная загрузка из Excel в DataGridView вызывает ошибку
Данные загружаю из Excel в DataGridView2 все нормально. Далее необходимо загрузить в DataGridView2 новый файл из Excel. Предварительно...

8
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
14.10.2017, 00:16
Лучший ответ Сообщение было отмечено Egor2014 как решение

Решение

Если нужно только чтение, то можно рекомендовать достаточно быструю библиотеку ExcelDataReader для чтения файлов Microsoft Excel (https://github.com/ExcelDataReader/ExcelDataReader ). Наличие Excel не обязательно.
Пример:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    Dim sPth As String = Path.Combine(Application.StartupPath, "Books.xlsx")
    Dim ds As DataSet
    'версия файла определяется автоматически
    Using stream = File.Open(sPth, FileMode.Open, FileAccess.Read)
        Using reader = ExcelReaderFactory.CreateReader(stream)
            ds = reader.AsDataSet()
        End Using
    End Using
    DataGridView1.DataSource = ds
    DataGridView1.DataMember = ds.Tables(0).TableName
End Sub
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
14.10.2017, 13:11  [ТС]
Редактирую данные, а потом сохраняю:

VB.NET
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Private Sub SaveData(ByVal iPath As String, ByVal iShtName As String)
        '-------------------------------------------
        '   Cохранить данные
        '-------------------------------------------
        Dim ds As New System.Data.DataSet
        ds.Tables.Add()
        Dim dt As System.Data.DataTable = ds.Tables(0)
        Dim dc As System.Data.DataColumn
        Dim dr As System.Data.DataRow
        Dim colIndex As Integer = 0
        Dim rowIndex As Integer = 0
 
        '   Проверка наличия данных в DataGridView
        If ((DataGridView1.Columns.Count = 0) Or (DataGridView1.Rows.Count = 0)) Then
            MessageBox.Show("Нет данных для сохранения!", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Exit Sub
        End If
 
        '   Добавить столбцы в этой таблице
        For i As Integer = 0 To DataGridView1.ColumnCount - 1
            ds.Tables(0).Columns.Add(DataGridView1.Columns(i).HeaderText)
        Next
 
        '   Добавить строки в таблицу
        For i As Integer = 0 To DataGridView1.RowCount - 1
            dr = ds.Tables(0).NewRow
            For j As Integer = 0 To DataGridView1.Columns.Count - 1
                dr(j) = DataGridView1.Rows(i).Cells(j).Value
            Next
            ds.Tables(0).Rows.Add(dr)
        Next
 
        '   Массив для данных
        Dim myArr(dt.Rows.Count + 1, dt.Columns.Count) As Object
 
        '   Заголовок
        For Each dc In dt.Columns
            myArr(0, colIndex) = dc.ColumnName
            colIndex = colIndex + 1
        Next
 
        '   Данные
        For Each dr In dt.Rows
            colIndex = 0
            For Each dc In dt.Columns
                myArr(rowIndex + 1, colIndex) = dr(dc.ColumnName)
                colIndex = colIndex + 1
            Next
            rowIndex = rowIndex + 1
        Next
 
        '   Excel
        xlApp = New Application
        xlWB = xlApp.Workbooks.Open(iPath)
        xlSht = xlWB.Worksheets(iShtName)
 
        xlSht.Cells.Clear()
        xlSht.Range("A1").Resize(UBound(myArr, 1), UBound(myArr, 2)).Value2 = myArr
 
        '-------------------------------------------------------------------
        '   Украшательства, форматируем на странице Excel
        '-------------------------------------------------------------------
        '   Выравнивание по центру всей таблицы
        xlSht.UsedRange.Columns.HorizontalAlignment = XlHAlign.xlHAlignCenter
        '   Выравнивание 1 столбца влево
        xlSht.Columns(1).HorizontalAlignment = XlHAlign.xlHAlignLeft
        '   Высота всех строк
        xlSht.UsedRange.Rows.RowHeight = 16
        '   Высота 1 строки
        xlSht.Rows(1).RowHeight = 23
        '   Жирным первую строку
        xlSht.Rows(1).Font.Bold = True
        '   Автоширина столбцов
        xlSht.UsedRange.Columns.AutoFit()
        '   Выравнивание по центру по вертикали
        xlSht.Range("A1", "S1").VerticalAlignment = XlHAlign.xlHAlignCenter
 
        '   div всего столбцов в Excel
        Dim div As Integer = colIndex
        '   В переменную номер столбца Регион
        Dim stolb As Integer
        stolb = xlSht.Columns.Find("Регион").Column
        '   Удаляем лишние столбцы
        If div > stolb Then xlSht.Range(xlSht.Columns(stolb + 1), xlSht.Columns(div)).EntireColumn.Delete()
 
        xlWB.Close(SaveChanges:=True)
        xlApp.Quit()
        '   Закрываем все процессы Excel
        ReleaseObject(xlSht)
        ReleaseObject(xlWB)
        ReleaseObject(xlApp)
 
        ' MessageBox.Show("Данные сохранены!", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information)
        StatusLabel1.Text = "Данные сохранены!"
        Me.StatusLabel1.ForeColor = Color.Red
    End Sub
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
14.10.2017, 18:51
Egor2014, а какой в этом смысл (загрузить, отредактировать, сохранить) и почему нельзя все это выполнить в рамках Excel (+VBA). И все будет максимально быстро (со скоростью первоисточника).
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
15.10.2017, 16:32  [ТС]
ovva, есть смысл, у меня снимаются данные XML Яндекса в программе
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
15.10.2017, 20:29
Один из возможных вариантов чтения я указал выше. Вариантов записи, отличных от традиционного перебора, также достаточно. Например, можно просто и быстро сохранить таблицу в формате xml, который без особых проблем можно открыть в Excel.
VB.NET
1
 ds.Tables(0).WriteXml("tmp1.xml")
Другой пример, но уже с использованием Microsoft.Office.Interop.
Кликните здесь для просмотра всего текста
VB.NET
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
44
45
46
47
Private Sub SaveV2_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    xlsApp = New Excel.Application
    Try
        xlsBook = xlsApp.Workbooks.Add() 'новая книга
        xlsSheet = xlsBook.ActiveSheet
        Dim n As Integer = ds.Tables(0).Rows.Count
        Dim m As Integer = ds.Tables(0).Columns.Count
        Dim ar(n - 1, m - 1) As Object
        Dim j As Integer = -1
        Using reader As DataTableReader = ds.Tables(0).CreateDataReader()
            Do
                If Not reader.HasRows Then
                    'MsgBox("Empty DataTableReader")
                Else
                    Do While reader.Read()
                        j += 1
                        For i As Integer = 0 To reader.FieldCount - 1
                            ar(j, i) = reader(i)
                        Next
                    Loop
                End If
            Loop While reader.NextResult()
        End Using
        Dim rng As Excel.Range = xlsSheet.Range(xlsSheet.Cells(1, 1), xlsSheet.Cells(ar.GetLength(0), ar.GetLength(1)))
        rng.Value2 = ar
        xlsBook.SaveAs(Path.Combine(Application.StartupPath, "tmp2.xls"))
    Catch ex As Exception
        MsgBox(ex.ToString())
    Finally
        xlsBook.Close()
        xlsApp.Quit()
        releaseObject(xlsSheet)
        releaseObject(xlsBook)
        releaseObject(xlsApp)
    End Try
End Sub
Private Sub releaseObject(obj As Object)
    Try
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
        obj = Nothing
    Catch ex As Exception
        obj = Nothing
        MessageBox.Show(ex.ToString(), "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Finally
        GC.Collect()
    End Try
End Sub

Можно также копировать данные непосредственно из DataGridView с использованием Microsoft.Office.Interop и Clipboard в лист Excel и сохранять его.
Есть немало библиотек работающих с данными Excel через Open XML, что достаточно быстро.
1
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
30.11.2019, 10:32  [ТС]
Пригодилось спустя 2 года). Перешел на Excel 2016 LoadDataFromXL перестало работать.
Через NuGet подключил ExcelDataReader.DataSet и ExcelDataReader
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
27.02.2020, 19:10  [ТС]
Добрый день!

Код работает, отлично:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    Dim sPth As String = Path.Combine(Application.StartupPath, "Books.xlsx")
    Dim ds As DataSet
    'версия файла определяется автоматически
    Using stream = File.Open(sPth, FileMode.Open, FileAccess.Read)
        Using reader = ExcelReaderFactory.CreateReader(stream)
            ds = reader.AsDataSet()
        End Using
    End Using
    DataGridView1.DataSource = ds
    DataGridView1.DataMember = ds.Tables(0).TableName
End Sub
Как сделать, чтоб в DataGridView только первые столбцы 12 штук помещались, их в Excel более 12
Код ниже вызывает ошибку:
VB.NET
1
2
3
4
        If ds.Tables(0).Columns.Count = 13 Then
            '    Удаляем 13 столбец
            ds.Tables(0).Columns.RemoveAt(13)
        End If
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
27.02.2020, 23:41
Egor2014, самое простое не отображать это поле
VB.NET
1
If ds.Tables(0).Columns.Count = 13 Then DataGridView1.Columns(12).Visible = False
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2020, 23:41
Помогаю со студенческими работами здесь

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

Загрузка данных из файла Excel в DataGridView
Здравствуйте! Есть проблема. Программа по нажатию кнопки на форме, должна считать файл Excel и поместить данные в датагрид на форме....

Загрузка файла Excel в DataGridView по FTP
Как реализовать загрузку таблицы файла xls по FTP в таблицу DataGridView? Если чтение файла через OFD еще можно реализовать,но как это...

Загрузка данных из Excel в DataGridView по условию
Всем привет! Возник такой вопрос - есть следующий фрагмент программы, которая отображает файл excel в DataGridView. ObjExcel = new...

загрузка dataGridView datatable из разных файлов Excel
Столкнулся с проблемой загрузки из разных документов Excel разница только в данных, число столбцов одинаковое всегда Первая загрузка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru