1

多亏了 ACE.OLEDB 提供商,我可以在不安装 excel 的情况下阅读 excel 表。我也可以使用以下方法遍历工作表,但如果我没记错的话,它需要安装 office:

 Set xlApp = CreateObject("Excel.Application")
    Set wb = xlApp.Workbooks.Open(txtExcelFile, ReadOnly:=True, editable:=False)
    If wb.Worksheets.Count = 0 Then
    MsgBox "Excel file contains no worksheets"
    GoTo SubEnd
    End If
    Dim i        As Integer

    For i = 1 To wb.Worksheets.Count
        cboWorksheet.AddItem (wb.Worksheets(i).Name)
    Next

我希望能够查询 excel 表来填写下拉列表,但是即使没有安装 office,我也可以这样做吗? 为了解释我们目前的情况,我为我们的 crm 构建了一个动态导入器,通常我们可以通过他们的服务器更容易地访问公司,与客户端 PC 相比,安装办公室的可能性更小。

所以我想在导入excel文件时不完全依赖office。当然这不是主要功能,我可以将工作表名称存储为文本字段,但如果可以选择相关的工作表名称会更好。

这可以做到吗,在vb6中?谢谢

4

2 回答 2

1

像这样?

'~~> Add Reference to MS ActiveX Data Objects xx.xx Library
Option Explicit

Private Sub Form_Load()
    Dim SheetName As String
    Dim RS As ADODB.Recordset
    Dim I As Long

    With CreateObject("ADOX.Catalog")
        .ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" _
                          & App.Path & "\sample.xls';" _
                          & "Extended Properties='Excel 5.0;HDR=No'"
        For I = 0 To .tables.Count - 1
            '~~> This will give you sheet names
            Debug.Print .tables(I).Name
        Next I
    End With
End Sub

截屏

我添加了一个List1和一个Command1来显示代码是如何工作的

在此处输入图像描述

于 2013-02-20T16:04:00.790 回答
1

你可以使用普通的 ADO(不是 ADOX)来做这样的枚举

Option Explicit

Private Sub Command1_Click()
    Dim vElem       As Variant

    For Each vElem In GetSheets("d:\temp\aaa.xlsx")
        Debug.Print vElem
    Next
End Sub

Private Function GetSheets(sFileName As String) As Collection
    Const adStateOpen As Long = 1
    Const adSchemaTables As Long = 20

    Set GetSheets = New Collection
    With CreateObject("ADODB.Connection")
        If LCase$(Right$(sFileName, 5)) = ".xlsx" Then
            .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sFileName & ";Extended Properties=Excel 12.0 Xml"
        Else
            .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFileName & ";Extended Properties=Excel 8.0"
        End If
        If .State <> adStateOpen Then
            Exit Function
        End If
        With .OpenSchema(adSchemaTables)
            Do While Not .EOF
                If LCase$(!TABLE_NAME) <> "database" Then
                    GetSheets.Add !TABLE_NAME.Value
                End If
                .MoveNext
            Loop
        End With
    End With
End Function
于 2013-02-21T08:40:25.583 回答