none
想请各位大大指点 RRS feed

  • 问题

  • 我正篇写xls convert mdb的程序。我遇到了下图问题。想请教各位大大指点迷津。谢谢感恩

     

    If File.Exists("D:\B.mdb") Then
                File.Delete("D:\B.mdb")
            End If
            DBPath = "D:\B.mdb"


            ' create DB via ADOX if not exists
            ' NOTE: to use ADOX add reference to COM Microsoft ADO Ext. 2.6 for DDL and Security!
            If Not File.Exists(DBPath) Then
                Dim cat As New ADOX.Catalog()
                cat.Create(Convert.ToString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") & DBPath)
                cat = Nothing


            End If


            conn = New OleDbConnection(Convert.ToString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") & DBPath)
            conn.Open()


            Try
                Using cmd As New OleDbCommand("CREATE TABLE [TEST] ([id] COUNTER PRIMARY KEY);", conn)
                    cmd.ExecuteNonQuery()
                End Using


            Catch ex As Exception
                If ex IsNot Nothing Then
                    ex = Nothing


                End If
            End Try


            ' initialize the connect string
            Dim _filename As String = "D:\Book1.xls"
            '' Dim _conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & _filename & ";" & "Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
            Dim path As String
            path = "D:\Book1.xls"
            Dim _conn As String = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1;';"
            Dim _connection As OleDbConnection = New OleDbConnection(_conn)


            'Use OledbCommand object to select all the data from sheet1 and execute an ExecuteNonQuery to import data into test.mdb.
            Dim _command As OleDbCommand = New OleDbCommand()
            _command.Connection = _connection


            Try
                Using conn As New OleDbConnection(_conn)
                    Using cmd As New OleDbCommand()
                        cmd.Connection = conn
                        cmd.CommandText = "INSERT INTO [MS Access;Database=" + DBPath + "].[test] SELECT * FROM [Sheet1$]"
                        conn.Open()
                        cmd.ExecuteNonQuery()
                    End Using
                End Using
                '_command.CommandText = "SELECT * FROM [Sheet1$]"
                '_connection.Open()
                '_command.ExecuteNonQuery()
                '_connection.Close()
                MessageBox.Show("The import is complete!")


            Catch e1 As Exception
                MessageBox.Show("Import Failed, correct Column name in the sheet!" & Environment.NewLine & "Error Message:" & Environment.NewLine & e1.Message)
            End Try

    2020年3月9日 9:35

答案

  • Hi christing,

    关于option strict on disallows late binding,由于我无法重现你的问题,你可以参考以下链接中给出的建议:

    Option Strict On disallows late binding

    如果你想要将数据先显示在DataGridView中,你可以将数据先导入到DataTable中,然后再将DataTable绑定到DataGridView,见以下链接中的代码。

    Import from excel to data table vb.net

    有了上面的DataTable,你就可以根据DataTable中的数据转换成Access中的Table。

    另外,如果你有更多关于从Excel提取数据到DataGridView,以及转换成Access表的问题,由于这与原始问题关系不大,我建议你创建一个新问题,我们会在新问题下提供建议。

    最后,如果你的原始问题已经得到解决,请将正确的回答标记为答案,这将帮助其他遇到类似问题的人快速找到解决方式。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 christing 2020年3月13日 14:37
    2020年3月13日 7:41
    版主

全部回复

  • Hi christing,

    对于

    Dim _conn As String = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1;';"

    将 ‘HDR=NO’ 改为'HDR=Yes',以此表示第一行包含列名,从而确保 Book1.xls 的列名和创建的数据库的表相匹配。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年3月10日 2:55
    版主
  • @Xing Yu Zhao

    感谢你的回复。

    我想请教Xing Yu Zhao

    1.如果每当user convert excel file 去 mdb 时,只是想要在convert的时候加一个ID column 剩余的follow excel 本身的内容而不是指定内容可以怎么篇写呢!

    2.如何让每次要convert的 excel file 标题设置为一致如下图

    感恩你的答复。谢谢

    2020年3月10日 8:14
  • Hi christing,

    >>只是想要在convert的时候加一个ID column 剩余的follow excel 本身的内容而不是指定内容可以怎么篇写呢!

    你能更加清晰的描述你遇到的问题吗?

    在我的测试里,我的 create 语句是:

    CREATE TABLE [TEST] ([id] COUNTER PRIMARY KEY, [name] Text, [age] Number);

    对应的我的 Excel 文件中的内容是:

    我最终得到的结果:

    如果你在这个过程中遇到其他问题,请提供更清晰的描述。

    期待你的更新。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年3月10日 8:55
    版主
  • @Xingyu Zhao

    感谢你的回复

    我想篇写的像下图的格式方式。 user 通过access database 选择 external data>new data source>from file>excel

    每个mdb file 成功 convert 后都会以ID 和Filed 来命名 


    篇写的代码是找xls export mdb  还是有其它名。我找的都是xls 普通convert mdb file格式

    谢谢你。感恩


    2020年3月11日 2:40
  • Hi christing,

    为了更加明确的进行测试,我想确认一下你的问题。

    1. 你是想将 Excel 中的多个 sheet 转换成 Access数据库中的多个 Table,然后再对mdb的每个table进行相应的命名吗?
    2. 还是说你想将 xls 的 Excel 表除了转成 mdb格式的数据库,也转成accdb格式呢。如果是这样,你只需要修改 'B.mdb' 为 'B.accdb'即可。
    3. 或者你想将 mdb格式的Access数据库 再转换成 Excel 中的表呢?

    期待你的更新。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    2020年3月11日 7:29
    版主
  • @Xingyu Zhao

    感谢你的回复。

    1.你是想将 Excel 中的多个 sheet 转换成 Access数据库中的多个 Table,然后再对mdb的每个table进行相应的命名吗?

    >>我是想将excel 中多个sheet转换成mdb 数据库中的多个Table。并且对每个mdb 的进行相应的命名。

    想请教当excel convert成access data数据库时,user能够选择要哪个excel column并且将他convert成access数据库吗。

    example:

    比方说下图excel sheet 有ABCDEFG 的columns ,user能够选择将ACEG的columns并且将它convert成access

    数据库吗?

    感恩你的回复。谢谢你

    2020年3月12日 0:54
  • Hi christing,

    你可以参考以下内容来根据你选择的不同Excel列, 将其转换成相应的Access数据库表。

    我的Excel表如下:

    假设我们需要选择将 B 和 D 列转换成相应的Access数据库表。

    将 B 和 D 输入数组:Dim arr As String() = {"B", "D"}

    我们需要获取到 B 和 D 所代表的 "name" 以及 "class"。另外考虑到统一性,一律将创建的Access数据库中的字段类型设置为 Text。

    详细代码如下:

    Imports Excel = Microsoft.Office.Interop.Excel
    
    Public Class Form1
        Private DBPath As String = ""
        Private conn As OleDbConnection
        Public Shared Function ColumnNumber(ByVal colAdress As String) As Integer
            Dim digits As Integer() = New Integer(colAdress.Length - 1) {}
    
            For i As Integer = 0 To colAdress.Length - 1
                digits(i) = Convert.ToInt32(colAdress(i)) - 64
            Next
            Dim mul As Integer = 1
            Dim res As Integer = 0
            For pos As Integer = digits.Length - 1 To 0
                res += digits(pos) * mul
                mul *= 26
            Next
    
            Return res
        End Function
        Private Function GetAllNamesForCreate(ByVal strArr As String()) As String
            Dim result As String = ""
            Dim xlApp As Excel.Application = New Excel.Application()
            Dim xlWorkbook As Excel.Workbook = xlApp.Workbooks.Open("D:\Book1.xls", 0, True, 5, "", "", True, Excel.XlPlatform.xlWindows, "", False, False, 0, True, False, False)
            Dim xlWorksheet As Excel._Worksheet = xlWorkbook.Sheets(1)
            Dim xlRange As Excel.Range = xlWorksheet.UsedRange
    
            For i As Integer = 0 To strArr.Length - 1
                Dim col As Integer = ColumnNumber(strArr(i))
                Dim colName As String = Convert.ToString(xlWorksheet.Cells(1, col).Value)
                result += " [" & colName & "]" & " Text,"
            Next
    
            xlWorkbook.Close(0)
            xlApp.Quit()
            Return result.Remove(result.Length - 1, 1)
        End Function
    
        Private Function GetAllNamesForSelect(ByVal strArr As String()) As String
            Dim result As String = ""
            Dim xlApp As Excel.Application = New Excel.Application()
            Dim xlWorkbook As Excel.Workbook = xlApp.Workbooks.Open("D:\Book1.xls", 0, True, 5, "", "", True, Excel.XlPlatform.xlWindows, "", False, False, 0, True, False, False)
            Dim xlWorksheet As Excel._Worksheet = xlWorkbook.Sheets(1)
            Dim xlRange As Excel.Range = xlWorksheet.UsedRange
    
            For i As Integer = 0 To strArr.Length - 1
                Dim col As Integer = ColumnNumber(strArr(i))
                Dim colName As String = Convert.ToString(xlWorksheet.Cells(1, col).Value)
                result += " [" & colName & "],"
            Next
    
            xlWorkbook.Close(0)
            xlApp.Quit()
            Return result.Remove(result.Length - 1, 1)
        End Function
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim arr As String() = {"B", "D"}
            If File.Exists("D:\B.mdb") Then File.Delete("D:\B.mdb")
            DBPath = "D:\B.mdb"
    
            If Not File.Exists(DBPath) Then
                Dim cat As ADOX.Catalog = New ADOX.Catalog()
                cat.Create(Convert.ToString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") & DBPath)
                cat = Nothing
            End If
    
            conn = New OleDbConnection(Convert.ToString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") & DBPath)
            conn.Open()
    
            Try
    
                Using cmd As OleDbCommand = New OleDbCommand($"CREATE TABLE [TEST] ([id] COUNTER PRIMARY KEY, {GetAllNamesForCreate(arr)} );", conn)
                    cmd.ExecuteNonQuery()
                End Using
    
            Catch ex As Exception
                If ex IsNot Nothing Then ex = Nothing
            End Try
    
            Dim path As String
            path = "D:\Book1.xls"
            Dim _conn As String = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & path & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;';"
    
            Try
                Using conn As OleDbConnection = New OleDbConnection(_conn)
    
                    Using cmd As OleDbCommand = New OleDbCommand()
                        cmd.Connection = conn
                        cmd.CommandText = "INSERT INTO [MS Access;Database=" & DBPath & $"].[test] SELECT {GetAllNamesForSelect(arr)} FROM [Sheet1$]"
                        conn.Open()
                        cmd.ExecuteNonQuery()
                    End Using
                End Using
                MessageBox.Show("The import is complete!")
            Catch e1 As Exception
                MessageBox.Show("Import Failed, correct Column name in the sheet!" & Environment.NewLine & "Error Message:" + Environment.NewLine + e1.Message)
            End Try
        End Sub
    End Class

    其中 'ColumnNumber' 方法用来获取Excel每一列代表的数字,比如B代表2,D代表4,从而可以获取对应的'name'以及'class'列名。

    测试结果:

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年3月12日 7:51
    版主
  • @Xingyu Zhao

    感谢你的回复。我想问ADOX.catalog是自己create一个 catalog.vb 吗?

    如果没有class catalog会出现error 

    我的代码出现option strict on disallows late binding在有这两个地方

    我使用了Option Strict Off 来解决了这个问题。这个代码(Option Strict Off )会影响到整个program 的 running吗?

    不知有更好的方式来解决Option Strict Off 的问题。

    ///////////////////////////////////////////////////////////////////////////////////////////////////////

    我想请教有关于Dim arr As String() = {"B", "D"}这个代码。

    有关 Dim arr As String() = {"B", "D"} 的代码。如果想篇写成user选择的column可以怎么篇写。

    example 当user选择了{"A", "B"} datagridview就会出现{"A", "B"} column数据,当另一个user 选择了{"A", "C"} datagridview就会出现{"A", "C"} column数据。

    我想要以代码的方式来控制user 的随机选项。

    ///////////////////////////////////////////////////////////////////////////////////////////////////////

    当user 读取excel data后。user 可以选择自己所要的columns 并且呈现在datagridview,在将datagridview的data export成mdb 或其他的file。

    感恩你的指教




    2020年3月13日 2:05
  • Hi christing,

    关于option strict on disallows late binding,由于我无法重现你的问题,你可以参考以下链接中给出的建议:

    Option Strict On disallows late binding

    如果你想要将数据先显示在DataGridView中,你可以将数据先导入到DataTable中,然后再将DataTable绑定到DataGridView,见以下链接中的代码。

    Import from excel to data table vb.net

    有了上面的DataTable,你就可以根据DataTable中的数据转换成Access中的Table。

    另外,如果你有更多关于从Excel提取数据到DataGridView,以及转换成Access表的问题,由于这与原始问题关系不大,我建议你创建一个新问题,我们会在新问题下提供建议。

    最后,如果你的原始问题已经得到解决,请将正确的回答标记为答案,这将帮助其他遇到类似问题的人快速找到解决方式。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 christing 2020年3月13日 14:37
    2020年3月13日 7:41
    版主