Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将Excel工作表导入datagridview-是否需要关闭工作簿才能使用OleDB?_Vb.net_Excel_Datagridview_Oledbconnection - Fatal编程技术网

Vb.net 将Excel工作表导入datagridview-是否需要关闭工作簿才能使用OleDB?

Vb.net 将Excel工作表导入datagridview-是否需要关闭工作簿才能使用OleDB?,vb.net,excel,datagridview,oledbconnection,Vb.net,Excel,Datagridview,Oledbconnection,我试图将Excel工作表导入datagridview,但遇到错误:“数据库或对象是只读的。”但是,我引用的工作簿没有应用只读属性。也就是说,如果我的应用程序正在运行,我连接的工作簿已经打开,所以我怀疑这就是我被此错误击中的原因。工作簿处于打开状态,因此在尝试填充数据集时,系统将显示为只读 我的假设正确吗?如果我要连接的工作簿处于打开状态,是否可以使用OleDB连接将Excel工作表导入datagridview?如果没有,是否有其他方法来填充此datagridview,而不必在我的工作表中进行大规

我试图将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)    

您是否尝试更改字符串;设置ReadOnly=True

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


或者更好的方法是,在运行代码之前让用户关闭工作簿

在使用应用程序期间,工作簿必须始终保持打开状态。我已将工作表复制到新工作簿,删除了不需要的列,保存并关闭了它,执行了查询,然后删除了文件。明天有机会的时候我会发布我的代码。谢谢你的再次保证。我会投票支持你,但显然我还不能
    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