简体   繁体   English

从 Excel 工作表读取

[英]Reading from Excel sheet

I have written the code below to read data from an Excel sheet and display data in a combobox in Visual Basic.我编写了下面的代码来从 Excel 工作表中读取数据并在 Visual Basic 的组合框中显示数据。

However, when I click "run" nothing is displayed.但是,当我单击“运行”时,什么也没有显示。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim MyConnection As New OleDb.OleDbConnection
        Dim MyCommand As New OleDb.OleDbCommand
        Dim filePath, sql As String
        filePath = "C:\Users\Nour\Desktop\projects\grade10\grade10\atlas.xlsx"
        sql = "Select continent from [Sheet1]"
        MyConnection.ConnectionString = $"Provider= Microsoft.Jet._OLEDB 11.0;data source = {filePath};Extended_Properties=Excel 8.0"
        MyConnection.Open()
        MyCommand.Connection = MyConnection
        MyCommand.CommandText = sql
        Dim da As New OleDb.OleDbDataAdapter
        da.SelectCommand = MyCommand
        Dim dt As New DataTable
        da.Fill(dt)
        Me.ComboBox1.DataSource = dt
        Me.ComboBox1.DisplayMember = dt.Columns(0).ToString


        MyConnection.Close()

Try this code试试这个代码

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim fname As String = "C:\Users\Nour\Desktop\projects\grade10\grade10\atlas.xlsx"
        Dim connectionStringTemplate As String = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source={0};" + "Extended Properties=""Excel 12.0;HDR=Yes"""
        Dim connectionString As String = String.Format(connectionStringTemplate, fname)
        Dim sqlSelect As String = "SELECT * FROM [Sheet1$];"
        Dim workbook As DataSet = New DataSet()
        Dim excelAdapter As System.Data.Common.DataAdapter = New System.Data.OleDb.OleDbDataAdapter(sqlSelect, connectionString)
        excelAdapter.Fill(workbook)
        Dim worksheet As DataTable = workbook.Tables(0)
        ComboBox1.DataSource = worksheet
        Me.ComboBox1.DisplayMember = worksheet.Columns(0).ToString
    End Sub

To read an xlsx file, rather than an xls file, you will need the ACE provider instead of the JET provider.要读取 xlsx 文件而不是 xls 文件,您将需要ACE 提供程序而不是 JET 提供程序。 You need to add the Extended Property "HDR=Yes" to tell it there is a header row.您需要添加扩展属性“HDR=Yes”以告诉它有一个标题行。

The name of a worksheet needs a $ after it.工作表的名称后面需要一个$

To make up a connection string, you can use a connectionstringbuilder - it will take care of adding any quotes or whatever is needed to create a valid connection string from the individual parts.要组成连接字符串,您可以使用 connectionstringbuilder - 它将负责添加任何引号或从各个部分创建有效连接字符串所需的任何内容。

A DataAdapter will open and close the connection for you. DataAdapter 将为您打开和关闭连接。

Some entities use unmanaged resources (ie they don't get automatically cleaned up after use) - they will have a .Dispose() method which will release those resources.一些实体使用非托管资源(即它们在使用后不会自动清理)——它们将有一个.Dispose()方法来释放这些资源。 Or you can use the Using construct to have it taken care of for you.或者您可以使用Using构造来为您处理它。

I used the ColumnName property instead of ToString as it is more obvious what it is.我使用了ColumnName属性而不是ToString因为它更明显。

I made a small Excel xlsx file to test with and used this program:我制作了一个小的 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

to get a combobox like this:获得这样的组合框:

在此处输入图片说明

First thing to check before going into code, compatibility between your database and your excel .在进入代码之前首先要检查数据库和 excel 之间的兼容性。 If you are using a 32bits excel version you will never be able to query a 64bits database.如果您使用的是 32 位 excel 版本,您将永远无法查询 64 位数据库。

Start with something simple, and then work up to more complex things.从简单的事情开始,然后再做更复杂的事情。

Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click

        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet

        xlApp = New Excel.ApplicationClass
        xlWorkBook = xlApp.Workbooks.Open("c:\test1.xlsx")
        xlWorkSheet = xlWorkBook.Worksheets("sheet1")
        'display the cells value B2
        MsgBox(xlWorkSheet.Cells(2, 2).value)
        'edit the cell with new value
        xlWorkSheet.Cells(2, 2) = "http://vb.net-informations.com"
        xlWorkBook.Close()
        xlApp.Quit()

        releaseObject(xlApp)
        releaseObject(xlWorkBook)
        releaseObject(xlWorkSheet)

    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub

End Class

Make this work, and then add in a ComboBox object.完成这项工作,然后添加一个 ComboBox 对象。

http://vb.net-informations.com/excel-2007/vb.net_excel_2007_open_file.htm http://vb.net-informations.com/excel-2007/vb.net_excel_2007_open_file.htm

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM