我想同时读出多个Excel的多个sheet里的每个单元格的内空存到多个数组里
用Excel.Application做好了,但是N慢!
听说当做数据库来读取会很快,但看了很多都是一个连接打开一个Excel操作的
应该一个连接也能打开多个吧? 要不每次都连费时我是刚用VB的,处理Excel的方面也没接触过
如果还有别的好的方法请赐教

解决方案 »

  1.   

    Dim adoConnection As New ADODB.Connection 
        Dim adoRecordset As New ADODB.Recordset 
        'OLE DB + ODBC Driver 方式: 
        'adoConnection.Open "Data Provider=MSDASQL.1;driver=Microsoft Excel Driver (*.xls);DBQ=e:\temp\book2.xls" 
        'Microsoft.Jet.OLEDB.4.0 方式,(建议) 
        adoConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=e:\temp\book2.xls;Extended Properties='Excel 8.0;HDR=Yes'" 
         
        adoRecordset.Open "select * from [sheet1$]", adoConnection, adOpenKeyset, adLockOptimistic 
        Debug.Print adoRecordset.RecordCount 
        Dim i As Integer 
        Do Until adoRecordset.EOF 
         For i = 0 To adoRecordset.Fields.Count - 1 
         Debug.Print adoRecordset.Fields.Item(0).Name 
         Debug.Print adoRecordset.Fields.Item(0).Value 
         Next i 
         adoRecordset.MoveNext 
        Loop 
         
        '注: OLE DB + ODBC Driver 方式不支持以下语句,但 Microsoft.Jet.OLEDB.4.0 方式支持! 
        adoConnection.Execute "insert into [sheet1$](F1) values(3)" 
        adoRecordset.AddNew Array("f1", "f2", "f3", "f4"), Array(1, 2, 3, 4)
      

  2.   

    你给的是一个连接打开处理一个表Excel我想要的是类似于一个连接处理多个Excel的方式
    要是每处理一个表就打开个连接不是很费时吗?
    还有这样处理的话有好几万条数据取每个单元格的内容是不是要几个小时?
      

  3.   

    晕,三楼的不是回答楼主的问题目吧,我从这里www.todayidc.com服务器方面可以了解不少
      

  4.   

    用VB处理过多个Excel取大量数据的朋友帮个忙呀!
    只要速度快就行了
      

  5.   

    不可能一個連接中處理多個Excel文件的
    為了加快速度你可以把得到的數據集一次性導入到數組中以下從CSDN中摘錄
    Private Sub Command1_Click()
        Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
        Dim i%, j%, arrData As Variant, strTmp As String
        cn.Open "Provider=SQLOLEDB.1;Password=;Persist Security Info=False;User ID=sa;Initial Catalog=Test;Data Source=ljx"
            
        rs.Open "select * from t1", cn, 1, 1
        
        arrData = rs.GetRows  '把數值賦給二維陣列
        For i = LBound(arrData, 2) To UBound(arrData, 2)
            strTmp = ""
            For j = LBound(arrData, 1) To UBound(arrData, 1)
                strTmp = strTmp & vbTab & arrData(j, i)
            Next
            Debug.Print strTmp  '列印陣列的資料
        Next
        rs.Close
        cn.Close
        Set rs = Nothing
        Set cn = NothingEnd Sub
      

  6.   

    Dim arr_sheet1(), arr_sheet2()'在 Access 数据库上打开连接,不用因为更换 Excel 数据源而重新打开连接
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=随便一个Access数据库"'用 In 语句将 Excel 表作为外部数据库打开,用 Set 语句免去关闭记录集
    Set rs = cn.Execute("select * from [sheet1$] in ""c:\test\1.xls"" ""Excel 8.0;""")
    '用 GetRows 方法直接将数据传递给数组(Variant 类型)
    arr_sheet1 = rs.GetRows()Set rs = cn.Execute("select * from [sheet2$] in ""c:\test\2.xls"" ""Excel 8.0;""")
    arr_sheet2 = rs.GetRows()
      

  7.   

    楼主可以通过剪贴板的来试试.
    核心代码:
    过程的目的就是将剪贴板中已经复制的数据放入表格中,当然你也可以直接放入数据库中.
    现在需要楼主自己解决的就是如何判断sheet表中数据的起止,这个完全可以通过代码Selection.End(xlDown).Select来实现(此为VBA代码,在VB中实现需要自行再调整一下).Private Sub Command1_Click()    Dim i As Long, j As Long
        Dim nRows As Long, nCols As Long
        Dim strTmp As String
        Dim aryDataRow As Variant, aryDataCol As Variant
        
        If IsEmpty(Clipboard.GetText) Then Exit Sub '如果剪贴板为空,则退出过程
        
        strTmp = Clipboard.GetText
        aryDataRow = Split(strTmp, Chr(13) & Chr(10))
        aryDataCol = Split(aryDataRow(0), Chr(9))
        nRows = UBound(aryDataRow)
        nCols = UBound(aryDataCol)    With MSFlexGrid1
        
            .Rows = nRows + 1
            .Cols = nCols + 2
        
            For i = 0 To nRows - 1
                Erase aryDataCol
                aryDataCol = Split(aryDataRow(i), Chr(9))
                
                For j = 0 To nCols
                    .TextMatrix(i + 1, j + 1) = aryDataCol(j)
                Next
            Next
        End With
        
        Clipboard.Clear '清空剪贴板  
        
    End Sub另外,楼上几位高手的解决方法不错,受教了:)