Windows窗体应用程序中的Excel工作表,无需打开Excel应用程序

时间:2011-11-18 14:15:25

标签: vb.net interop excel-interop

我正在将多个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的情况下获取工作表对象,或者至少提供合理的替代方案,我将非常感谢帮助。

2 个答案:

答案 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

我希望它有所帮助!