我正在将多个VBA项目转换为Windows窗体应用程序。我唯一的问题是Excel的某些功能对于应用程序是必不可少的,例如R1C1公式。我不想实例化Excel应用程序或访问已保存的工作表。通过查询Oracle数据库来检索所有数据。二维数组不是一个选项,因为列包含不同的数据类型,并且DataGridViews太慢而无法使用。
我认为简单地调暗Microsoft.Office.Interop.Excel.Worksheet对象就足够了,但程序仍然失败,并且在调试模式下检查对象的元素时,我发现每个值都说明了这一点:
{“无法将类型为'Microsoft.Office.Interop.Excel.WorksheetClass'的COM对象转换为接口类型'Microsoft.Office.Interop.Excel._Worksheet'。此操作失败,因为QueryInterface调用COM组件由于以下错误,IID'{000208D8-0000-0000-C000-000000000046}'的接口失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))。“}
如果有人能够告诉我如何在不打开Excel的情况下获取工作表对象,或者至少提供合理的替代方案,我将非常感谢帮助。
答案 0 :(得分:1)
您可能需要正确地即时对象。工作表需要Excel COM对象,因此您通常会先进行即时更新然后访问工作表。以下是一些示例代码:
Dim xl As Microsoft.Office.Interop.Excel.Application
xl = New Microsoft.Office.Interop.Excel.Application
Dim wb As Microsoft.Office.Interop.Excel.Workbook
wb = xl.Workbooks.Add()
Dim ws As Microsoft.Office.Interop.Excel.Worksheet
ws = wb.ActiveSheet
现在您可以使用ws
。请注意,我没有使用Dim .. as New
即时消息。
通过这样做,您将获得在后台运行的Excel的不可见实例。完成后,您必须明确关闭应用程序,以防止它留在内存中:
/// after your are finished
xl.Quit()
Marshal.ReleaseComObject(xl)
如果您在某种循环中使用它,这一点尤其重要。
答案 1 :(得分:1)
也许你已经解决了这个问题,但这是我的解决方案,我使用了你发布的内容以及我从另一篇文章中找到的内容,所以我可以告诉你这个工作正常,这是我的例子:
Dim xlApp As New Microsoft.Office.Interop.Excel.Application
Dim oldCI As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
xlApp.Workbooks.Add()
xlApp.ActiveSheet.Delete()
xlApp.ActiveSheet.Delete()
With xlApp
With .ActiveSheet.QueryTables.Add("ODBC;DRIVER=SQL Server;SERVER=" & DAO.GetNombreServidor & ";UID=" & DAO.GetLoginUsuario & ";PWD=" & DAO.GetPassUsuario & ";WSID=RICARDO2;DATABASE=" & DAO.GetNombreBaseDeDatos & "", xlApp.Range("A1"))
.CommandText = "SELECT * FROM ESTADOS"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
'.RefreshStyle = xlOverwriteCells
'xlInsertDeleteCells
.SavePassword = False
.SaveData = False
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.Refresh(False)
End With
End With
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI
xlApp.Visible = True
我希望它有所帮助!