| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4620 人关注过本帖
标题:问关于ADO读取EXCEL内资料的问题
取消只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
结帖率:97.66%
收藏
已结贴  问题点数:100 回复次数:7 
问关于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
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
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
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
不知道是否有软件能依需求自动生成所需的SQL语法的?
我知道WMI有我有抓到~有些数据库软件内建也有~
不知道有没有单独生成SQL代码的绿色软件~
不要叫我安装数据库~

不要選我當版主
2016-12-29 10:01
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
没办法看了一堆视频~还是想不通SQL语法怎写~只好还是回归基本~
用自定义结构来处理数据库资料~
换个角度想~数据库资料不就是结构化的数据吗?
只是它的结构我不会用~只好自创~
我不会用SQL去处理一般数据库的资料~
只好自定义结构去储存数据库捞出来的资料~
再用VB语法去实现原本用SQL去处理数据库资料的结果~

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

讲直接一点就是绕远路~

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



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

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