| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4757 人关注过本帖
标题:问关于ADO读取EXCEL内资料的问题
只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
结帖率:97.66%
收藏
已结贴  问题点数:100 回复次数:12 
问关于ADO读取EXCEL内资料的问题
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后再处理的后备方案也行~)
搜索更多相关主题的帖子: 如何 资料 EXCEL 网页教学 网上 
2016-12-26 10:35
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
想不到意外的简单~仿造C#的读取方式转为VB6使用~
而且网上的示例读取字符串一般都用 : Provider=Microsoft.Jet.OLEDB.4.0
但是2007无法使用此方式~须改用 : Provider=Microsoft.ACE.OLEDB.12.0
读取EXCEL內650多万格字符串进VB6耗时约16秒~

只是不能直接读入指定的Array内吗?还得再从控件上读入一次?
图片附件: 游客没有浏览图片的权限,请 登录注册


不要選我當版主
2016-12-26 13:21
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
650多万格资料要是用COM方式去写怕是要跑个几小时才能读完吧~

不要選我當版主
2016-12-26 13:23
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:941
专家分:5244
注 册:2015-8-10
收藏
得分:34 
1.如果你一个sheet就是一个完整的表,没有其他的内容,可以直接select * from [Sheet1$]
否则的话,只能是你自己搞清楚那些区域是有效数据,你自己都搞不清楚别人也无法
2. mschart可以实现。
2016-12-26 19:33
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用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编辑过]


不要選我當版主
2016-12-27 02:56
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
题外话DataGrid1这控件只支持Office 2003〜栏位最多只到255栏〜超过就无视了〜不过还好这次需要没这问题〜

不要選我當版主
2016-12-27 03:03
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:34 
路过!
DataGrid有255栏的上限?还真不知道,不过一旦记录超过100我通常会用分页方式解决。
2016-12-27 09:37
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:34 
回复 6楼 wube

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

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


也许 里的带的驱动会突破这个限制。

授人于鱼,不如授人于渔
早已停用QQ了
2016-12-27 12:37
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
共同点:都是做为连接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时,要注意使用合适的引擎。

授人于鱼,不如授人于渔
早已停用QQ了
2016-12-27 12:44
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用风吹过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语法不熟很头大~

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

    目前不考虑~因为不懂的地方会更多~

不要選我當版主
2016-12-27 12:58
快速回复:问关于ADO读取EXCEL内资料的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052577 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved