注册 登录
编程论坛 VB6论坛

问关于ADO读取EXCEL内资料的问题

wube 发布于 2016-12-26 10:35, 5011 次点击
http://

最近有个案子有这方面的需求~以前都用COM来读取资料~虽然简单但速度超慢~
再网上看到这网页教学~试了一下DataBinding是还蛮好用的~
但疑问是我要如何预知从哪里读到哪里(EXCEL内资料数量事前未知时)?

1. 下面这段 [Sheet1$A1:C10002] 若是前未知时要如何取得?
程序代码:
Private Sub cmdReadExlbyDataBinding_Click()
  Dim cn As New ADODB.Connection
  Dim rs As New ADODB.Recordset
  Dim t1, t2, t As Date

  t1 = Now

  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & App.Path & "\sample.xls;" & _
          "Extended Properties=""Excel 8.0;HDR=YES;"""
  cn.CursorLocation = adUseClient
      
  rs.Open "SELECT * FROM [Sheet1$A1:C10002]", cn, adOpenStatic

  Set DataGrid1.DataSource = rs
  DataGrid1.Refresh

  t2 = Now

  t = t2 - t1

  MsgBox Second(t)

End Sub

第一次学习用ADO读取EXCEL资料~

2. 需求是要将EXCEL内资料当数据库用SQL语法来读取~读取出来后再将数据绘出图表~
(所以不了解如何事先知道栏列数量?或是读进VB6的Array后再处理的后备方案也行~)
12 回复
#2
wube2016-12-26 13:21
想不到意外的简单~仿造C#的读取方式转为VB6使用~
而且网上的示例读取字符串一般都用 : Provider=Microsoft.Jet.OLEDB.4.0
但是2007无法使用此方式~须改用 : Provider=Microsoft.ACE.OLEDB.12.0
读取EXCEL內650多万格字符串进VB6耗时约16秒~

只是不能直接读入指定的Array内吗?还得再从控件上读入一次?
只有本站会员才能查看附件,请 登录

#3
wube2016-12-26 13:23
650多万格资料要是用COM方式去写怕是要跑个几小时才能读完吧~
#4
xiangyue05102016-12-26 19:33
1.如果你一个sheet就是一个完整的表,没有其他的内容,可以直接select * from [Sheet1$]
否则的话,只能是你自己搞清楚那些区域是有效数据,你自己都搞不清楚别人也无法
2. mschart可以实现。
#5
wube2016-12-27 02:56
以下是引用xiangyue0510在2016-12-26 19:33:23的发言:

1.如果你一个sheet就是一个完整的表,没有其他的内容,可以直接select * from [Sheet1$]
否则的话,只能是你自己搞清楚那些区域是有效数据,你自己都搞不清楚别人也无法
2. mschart可以实现。
这些我都试出来了,抱歉问了一些白痴问题~
试了一天〜查了一堆资料〜发现〜
rs.Open "SELECT * FROM [Sheet1$]", cn, adOpenStatic
我发现这行指令其实就已经将整个Sheet1资讯读取进内存了
Set DataGrid1.DataSource = rs
而这行是将内存资料再转到显示在控制中而已
其实ADO是直接存取EXCEL内指定资料到内存结构中(这结构体就是类似之前问过的VB6建不出来的那种结构体)

所以目前新的问题是:
一 .Set DataGrid1.DataSource = rs 这行指令到底做了什么事〜要是知道就能将资料写到我指定的位置(我自订的)因为功能被包起来了〜无法得知内部程序运作方式〜
二 .若有必要,将数据库中的某个栏位内相同特征对应数值加总并取出值~再将该多项值丢给MsChart去产生的图表〜这部分我能无耻的求个代码来参考一下吗?
三 .还是只能用最笨的方法先读入空间中再去操作〜这会很慢〜我不想这么做〜

目前理解是如此〜若有错误还请高人指教纠正〜请高手提供意见和示例以供参考〜谢谢〜


[此贴子已经被作者于2016-12-27 02:58编辑过]

#6
wube2016-12-27 03:03
题外话DataGrid1这控件只支持Office 2003〜栏位最多只到255栏〜超过就无视了〜不过还好这次需要没这问题〜
#7
xzlxzlxzl2016-12-27 09:37
路过!
DataGrid有255栏的上限?还真不知道,不过一旦记录超过100我通常会用分页方式解决。
#8
风吹过b2016-12-27 12:37
回复 6楼 wube

 这个限制不是这控件的限制,而是 ADO 驱动的限制。
老版本的 EXCEL 限制不超过255栏,ADO驱动就继承了这个限制。
一个系统太多庞大了,改一个地方,有可能在其他可能的影响到的范围内没有得到修改。

RS,可以使用 PropertyBag 转出来,但我没去测试过有些啥东西在内。
PropertyBag 转出来是一个一维BYTE数组。
我针对 Picture 转出来的数据分析过,但对 RS 真没分析过。
以前有人使用这个对象,做了一个使用 winsock 远程访问 Access 的 C/S 程序来。


也许 里的带的驱动会突破这个限制。
#9
风吹过b2016-12-27 12:44
共同点:都是做为连接Excel对象的接口引擎

不同点:
对于不同的Excel版本,有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。

Jet 引擎,可以访问 Office 97-2003,但不能访问 Office 2007。

ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。

另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。

所以,在使用不同版本的office时,要注意使用合适的引擎。
#10
wube2016-12-27 12:58
以下是引用风吹过b在2016-12-27 12:37:41的发言:

 
 这个限制不是这控件的限制,而是 ADO 驱动的限制。
老版本的 EXCEL 限制不超过255栏,ADO驱动就继承了这个限制。
一个系统太多庞大了,改一个地方,有可能在其他可能的影响到的范围内没有得到修改。
 
RS,可以使用 PropertyBag 转出来,但我没去测试过有些啥东西在内。
PropertyBag 转出来是一个一维BYTE数组。
我针对 Picture 转出来的数据分析过,但对 RS 真没分析过。
以前有人使用这个对象,做了一个使用 winsock 远程访问 Access 的 C/S 程序来。
 
 
也许 里的带的驱动会突破这个限制。

    "老版本的 EXCEL 限制不超过255栏,ADO驱动就继承了这个限制。"
    ADO驱动 Provider=Microsoft.ACE.OLEDB.12.0 我已经改用新版了还会有这问题?
    不过没差~这只是示例上发现的~实际上这次需求的操作也不需要将资料放在控件中~

    RS里用VB6的监视器就能看到~只是很好奇它是怎么放到DataGrid1.DataSource里面的~
    明明资料型态名称完全不同
   
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

    这种仓库型的结构体~就像我之前说的~完全不知道怎建出来了~我想该不会又是要用For Each去搜寻指定对象吧?
    完全毫无头绪~不然就是要直接在上一段SQL语法上一次将所需求条件搞出来~不过我对SQL语法不熟很头大~

    最后一招~就不管它怎么被读入控件中~我只要再去控件中把资料读出来二次处理~不过这感觉多花一次功夫~

    目前不考虑~因为不懂的地方会更多~
#11
xiangyue05102016-12-27 13:25
一 .Set DataGrid1.DataSource = rs 这行指令到底做了什么事〜要是知道就能将资料写到我指定的位置(我自订的)因为功能被包起来了〜无法得知内部程序运作方式〜

这个不清楚你想做什么,控件已经封装了,具体如何实现无法确定,无非类似于向Grid中逐个单元格填数据的过程

二 .若有必要,将数据库中的某个栏位内相同特征对应数值加总并取出值~再将该多项值丢给MsChart去产生的图表〜这部分我能无耻的求个代码来参考一下吗?

前面半句其实就是条件查询,  Select SUM(求和列名) From 表名 where 条件列名="ID"。请自行查看SQL语句,学数据库不学一点SQL是不行的。
后半句因为不清楚你到底要实现什么样的效果,建议自己找一下mschart的例码,其实很简单就是给mschart的序列赋值的过程,而不同的显示效果代码有一些区别。下面是百度文库上的例子。
http://wenku.baidu.com/link?url=_DLZgwIfees1kVOQ3C0qWZH5Kt2jzZekLjJjY2r5UAeFG8F7t6dBZ--A8XrDaQAWuORBv4e88eNb_KAzxOua3dtzkUdKDXtdpDu5qn_s5nG

不过话说,你既然是求和了,就只有一个值,如何才chart上体现??mschart需要的是一个或者几个序列

三 .还是只能用最笨的方法先读入空间中再去操作〜这会很慢〜我不想这么做〜

这个没有必要这样。
#12
wube2016-12-29 10:01
不知道是否有软件能依需求自动生成所需的SQL语法的?
我知道WMI有我有抓到~有些数据库软件内建也有~
不知道有没有单独生成SQL代码的绿色软件~
不要叫我安装数据库~
#13
wube2016-12-30 17:46
没办法看了一堆视频~还是想不通SQL语法怎写~只好还是回归基本~
用自定义结构来处理数据库资料~
换个角度想~数据库资料不就是结构化的数据吗?
只是它的结构我不会用~只好自创~
我不会用SQL去处理一般数据库的资料~
只好自定义结构去储存数据库捞出来的资料~
再用VB语法去实现原本用SQL去处理数据库资料的结果~

就像人家EXCEL要筛出重复资料只需按个按钮就行~
用VB做要用两个FOR去跑出来~

讲直接一点就是绕远路~
1