从Excel工作表中读取

时间:2019-01-27 17:16:28

标签: excel vb.net jet

我已经编写了以下代码,以从Excel工作表中读取数据并在Visual Basic中的组合框中显示数据。

但是,当我单击“运行”时,什么也没有显示。

private void ListOfPaidProducts_Format(object sender, ListControlConvertEventArgs e)
{
    string currentProductName = ((Product)e.ListItem).Description;
    string currentPrice = String.Format("{0}", ((Product)e.ListItem).Price); // I tried even with {0,20}....

    string currentProductNamePadded = currentProductName.PadRight(30);

    e.Value = currentProductNamePadded + currentPrice + "$";
}

4 个答案:

答案 0 :(得分:1)

尝试此代码

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

答案 1 :(得分:1)

要读取xlsx文件而不是xls文件,您将需要ACE provider而不是JET提供程序。您需要添加扩展属性“ HDR = Yes”以告诉它存在标题行。

工作表的名称后需要$

要组成连接字符串,可以使用connectionstringbuilder-它会添加任何引号或从各个部分创建有效连接字符串所需的内容。

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

答案 2 :(得分:0)

在编写代码之前首先要检查的是数据库与excel之间的兼容性。如果您使用的是32位的excel版本,则将永远无法查询64位的数据库。

答案 3 :(得分:0)

从简单的事情开始,然后处理更复杂的事情。

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

完成这项工作,然后添加一个ComboBox对象。

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