Чтобы прочитать файл xlsx, а не файл xls, вам понадобится поставщик ACE вместо поставщика JET.Вам нужно добавить расширенное свойство "HDR = Yes", чтобы сообщить, что в нем есть строка заголовка.
Для имени рабочего листа после него должно быть $
.
Для созданияСтрока соединения. Вы можете использовать построитель соединений - он позаботится о добавлении любых кавычек или чего-либо еще, что необходимо для создания допустимой строки соединения из отдельных частей.
DataAdapter откроет и закроет соединение для вас.
Некоторые объекты используют неуправляемые ресурсы (т.е. они не очищаются автоматически после использования) - у них будет метод .Dispose()
, который освобождает эти ресурсы.Или вы можете использовать конструкцию Using
, чтобы позаботиться о вас.
Я использовал свойство ColumnName
вместо ToString
, так как оно более очевидно.
Я сделал небольшой файл Excel xlsx для тестирования и использовал эту программу:
Imports System.Data.OleDb
Public Class Form1
Sub PopulateCB()
Dim filepath = "C:\temp\Continents.xlsx"
Dim csb As New OleDbConnectionStringBuilder
csb.Provider = "Microsoft.ACE.OLEDB.12.0"
csb.DataSource = filepath
csb.Add("Extended Properties", "Excel 12.0 Xml;HDR=YES")
Dim sql = "SELECT Continent FROM [Sheet1$]"
Dim dt As New DataTable
Using da As New OleDbDataAdapter(sql, csb.ConnectionString)
da.Fill(dt)
End Using
ComboBox1.DataSource = dt
ComboBox1.DisplayMember = dt.Columns(0).ColumnName
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PopulateCB()
End Sub
End Class
, чтобы получить такой комбинированный список:
![enter image description here](https://i.stack.imgur.com/PYKlD.png)