Member 12877669 Ответов: 1

Загрузите данные из excel в datagridview in VB.NET


Еще неделю назад все работало, а теперь ничего не работает, что наводит меня на подозрение, что Microsoft что-то изменила в Net Framework, Windows 10 Anniversary Update или в PIA. В прошлом я просто использовал мастер для привязки моих данных в электронной таблице Excel к элементу управления DataGridView, и он просто работал. Но примерно неделю назад моя программа вдруг перестала загружать COM-библиотеку с ранним связыванием, но я смог заставить ее работать с поздним связыванием. Но он забил мой дисплей DataGridView (dgv), и я не смог его вернуть.

Что я уже пробовал:

Теперь, если я использую мастер, я просто получаю пустой dgv без каких-либо данных. Если я попытаюсь сделать это в коде, то команда OleDbAdapter.Fill (dataset) больше не работает, и он выдает исключение. Вот код, который я использую....
Imports System.Data.OleDb

Public Class Form1

    Dim con As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\Dave\Documents\clients.xls"
    Dim Myconn As OleDbConnection
    Dim da As OleDbDataAdapter
    Dim ds As DataSet
    Dim tables As DataTableCollection
    Dim src As New BindingSource

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Myconn = New OleDbConnection
        Myconn.ConnectionString = con
        ds = New DataSet
        tables = ds.Tables
        da = New OleDbDataAdapter("Select * from [clients]", Myconn)
        da.Fill(ds, "clients")  'this step fails and throws the exception
        Dim view As New DataView(tables(0))
        src.DataSource = view
        dgv.DataSource = view

    End Sub

End Class

Richard MacCutchan

Интересно, какое может быть исключение?

Member 12877669

Забавная штука! Я удалил office365 и вернулся в Office 2013, и теперь вдруг все мои программы снова работают. Таким образом, похоже, что MS "улучшает" вещи, вроде того, что они сделали с VB6.

Mehdi Gholam

Попробуйте еще раз переустановить oledb-провайдер.

Member 12877669

Забавная штука! Я удалил office365 и вернулся в Office 2013, и теперь вдруг все мои программы снова работают. Таким образом, похоже, что MS "улучшает" вещи, вроде того, что они сделали с VB6. Я попытался переустановить OLEDB, но безуспешно. Я не знаю, почему Office 2013 так отличается от Office 2016, но это так.

Member 12877669

Забавная штука! Я удалил office365 и вернулся в Office 2013, и теперь вдруг все мои программы снова работают. Таким образом, похоже, что MS "улучшает" вещи, вроде того, что они сделали с VB6.

Majesss

Я предполагаю, что у вас была проблема с более старой ссылкой, используемой при работе с Microsoft Excel Interop в C# или VB.NET вам необходимо обновить свои ссылки при обновлении версии Microsoft Office.
Однако вы можете избежать этого, если измените свой подход, например, используя следующее C# и VB.NET библиотека Excel вы можете прямо экспортируйте данные Excel в элемент управления DataGridView.

1 Ответов

Рейтинг:
1

kasbaba

Вы должны дать EPPLUS попробовать. Я использую его почти во всех своих проектах для чтения файлов excel.

С помощью всего нескольких строк кода Вы можете читать файлы excel.

Скачать EPPLUS.dll и сохраните его в папке вашего проекта.
Добавьте его в ссылку через меню Добавить ссылку

В вашем модуле/классе/форме напишите:

Imports OfficeOpenXml


Создайте вложенный файл для чтения - передайте имя файла
Private Sub ReadFile(txt_filepath as string)
Try
Using pck As New ExcelPackage()
                'Open the Excel file and load it to the ExcelPackage'
                Using stream = File.OpenRead(txt_filepath)
                    pck.Load(stream)
                End Using

                Dim ws As ExcelWorksheet = pck.Workbook.Worksheets(1)
                Dim myDT As DataTable = WorksheetToDataTable(ws, True)
End Using
Catch ex As Exception
            MessageBox.Show("Could not read data. Original error: " + ex.Message)
        End Try
end sub


- Эта функция считывает файл и преобразует его в DataTable, который вы можете использовать или привязать непосредственно к вашей datagrid
Public Function WorksheetToDataTable(ByVal ws As ExcelWorksheet, Optional ByVal hasHeader As Boolean = True) As DataTable
     Dim dt As New DataTable(ws.Name)
     Dim totalCols As Integer = ws.Dimension.[End].Column
     Dim totalRows As Integer = ws.Dimension.[End].Row
     Dim startRow As Integer = If(hasHeader, 2, 1)
     Dim wsRow As ExcelRange
     Dim dr As DataRow
     For Each firstRowCell As Object In ws.Cells(1, 1, 1, totalCols)
         dt.Columns.Add(If(hasHeader, firstRowCell.Text, String.Format("Column {0}", firstRowCell.Start.Column)))
     Next

     For rowNum As Integer = startRow To totalRows
         wsRow = ws.Cells(rowNum, 1, rowNum, totalCols)
         dr = dt.NewRow()
         For Each cell As Object In wsRow
             dr(cell.Start.Column - 1) = cell.Text
         Next

         dt.Rows.Add(dr)
     Next

     Return dt
 End Function


Там есть еще несколько образцов, но этот делает свою работу

Одним из недостатков является то, что он может читать только файлы Excel, отформатированные как HTML (xlsx). Он не смог бы прочитать xls-файл без значительной работы.

Надеюсь, это поможет.