1

我正在尝试将 Excel 工作表导入 datagridview,但遇到错误:“数据库或对象是只读的。” 但是,我引用的工作簿没有应用只读属性。话虽如此,如果我的应用程序正在运行,我正在连接的工作簿已经打开,所以我怀疑这就是我遇到此错误的原因。工作簿已打开,因此在尝试填充数据集时对系统显示为只读。

我的这个假设是对的吗?如果我要连接的工作簿是打开的,他们是否可以使用 OleDB 连接将 Excel 工作表导入 datagridview?如果没有,是否有任何其他方法可以填充此 datagridview 而无需通过我的工作表进行大规模循环?我的代码如下:

   Try

        'connect to Excel data source and set gridview equal to dataset (entire sheet should be visible in gridview)
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & StatVar.workbookName & ";Extended Properties=""Excel 12.0;HDR=YES;Readonly=False"";" 'may need to use different MS provider and lower OLEDB for .xls files (Microsoft.Jet.OLEDB4.0...Excel 8.0) kind of sketchy though
        MyConnection = New System.Data.OleDb.OleDbConnection(connstring) 'create a new data connection to Excel data source
        MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Budget$]", MyConnection) 'query the sheet - select all data
        MyCommand.TableMappings.Add("Table", "Table") 'map data selection as table
        StatVar.DtSet1 = New System.Data.DataSet 'create new data set
        MyCommand.Fill(StatVar.DtSet1) 'fill data set with table
        Form14.DataGridView1.DataSource = StatVar.DtSet1.Tables(0) 'populate gridview with data set table
        MyConnection.Close()
        Form14.ShowDialog()
    Catch exc As Exception
        MessageBox.Show("There was a problem loading this database. Please contact an administrator if the problem continues." & vbNewLine & vbNewLine & "Error: " & exc.Message)

    End Try

我在这里遇到错误:

MyCommand.Fill(StatVar.DtSet1)    
4

2 回答 2

1
    Try
        Cursor = Cursors.WaitCursor
        'can't populate gridview with an open file using OLEDB - need to export the Budget sheet to a new file, close it, connect with OLEDB, then delete the temp Budget.xls file just created
        'copy Budget sheet to new workbook, delete unneeded columns, save file as Budget.xls, close workbook
        Dim filenm = "W:\TOM\ERIC\Budget Temp\Budget.xls"
        StatVar.xlApp.Sheets("Budget").Copy()
        StatVar.xlApp.ActiveWorkbook.Sheets("Budget").Columns("C:DY").Delete()
        StatVar.xlApp.ActiveWorkbook.SaveAs("W:\TOM\ERIC\Budget Temp\Budget.xls")
        StatVar.xlApp.ActiveWorkbook.Close(True)

        'connect to Excel data source and set gridview equal to dataset (entire sheet should be visible in gridview)
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & filenm & ";Extended Properties=""Excel 12.0;HDR=YES;Readonly=False"";" 'may need to use different MS provider and lower OLEDB for .xls files (Microsoft.Jet.OLEDB4.0...Excel 8.0) kind of sketchy though
        MyConnection = New System.Data.OleDb.OleDbConnection(connstring) 'create a new data connection to Excel data source
        MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Budget$A:F]", MyConnection) 'query the sheet - select all data in columns A:F
        MyCommand.TableMappings.Add("Table", "Table") 'map data selection as table
        StatVar.DtSet1 = New System.Data.DataSet 'create new data set
        MyCommand.Fill(StatVar.DtSet1) 'fill data set with table
        Form14.DataGridView1.DataSource = StatVar.DtSet1.Tables(0) 'populate gridview with data set table
        MyConnection.Close()

        'delete temporary Budget.xls file created at beginning of procedure and show Budget Codes form
        File.Delete(filenm)
        Form14.TxtBoxAutoCode.Text = StatVar.xlApp.Sheets("Budget").Range("EU2").Text
        Form14.ShowDialog()
    Catch exc As Exception
        MessageBox.Show("There was a problem loading this database. Please contact an administrator if the problem continues." & vbNewLine & vbNewLine & "Error: " & exc.Message)
    Finally
        Cursor = Cursors.Default
    End Try
于 2013-07-12T01:58:15.820 回答
1

您是否尝试更改连接字符串?设置只读=真

如果这不起作用,您可以制作工作簿的副本,然后查询该副本。如果你这样做,它会得到你上次保存的工作簿。如果这是一个问题,您可以在复制之前保存打开的工作簿。

或者更好的是,只需要求用户在运行代码之前关闭工作簿。

于 2013-07-11T02:24:17.180 回答