同时读多个Excel,如何高效?

wcmj 2006-05-11 10:42:43
我想同时读出多个Excel的多个sheet里的每个单元格的内空存到多个数组里
用Excel.Application做好了,但是N慢!
听说当做数据库来读取会很快,但看了很多都是一个连接打开一个Excel操作的
应该一个连接也能打开多个吧? 要不每次都连费时

我是刚用VB的,处理Excel的方面也没接触过
如果还有别的好的方法请赐教
...全文
259 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcmj 2006-05-15
  • 打赏
  • 举报
回复
多谢各位帮忙,以上方法我会试验的
不知还有没有更好的方法
of123() ( ) 信誉:125
的好像不错我试试
迈克揉索芙特 2006-05-11
  • 打赏
  • 举报
回复
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)
summersong 2006-05-11
  • 打赏
  • 举报
回复
楼主可以通过剪贴板的来试试.


核心代码:
过程的目的就是将剪贴板中已经复制的数据放入表格中,当然你也可以直接放入数据库中.
现在需要楼主自己解决的就是如何判断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

另外,楼上几位高手的解决方法不错,受教了:)
zhangzhijian 2006-05-11
  • 打赏
  • 举报
回复
mark
of123 2006-05-11
  • 打赏
  • 举报
回复
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()
DengXingJie 2006-05-11
  • 打赏
  • 举报
回复
不可能一個連接中處理多個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 = Nothing

End Sub
wcmj 2006-05-11
  • 打赏
  • 举报
回复
用VB处理过多个Excel取大量数据的朋友帮个忙呀!
只要速度快就行了
bravelc422 2006-05-11
  • 打赏
  • 举报
回复
晕,三楼的不是回答楼主的问题目吧,我从这里www.todayidc.com服务器方面可以了解不少
wcmj 2006-05-11
  • 打赏
  • 举报
回复
你给的是一个连接打开处理一个表Excel

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

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧