找回密码
 加入
搜索
查看: 7183|回复: 8

[效率算法] Ado读取Excel中的数据为什么是从第二行开始的呢?

  [复制链接]
发表于 2013-11-18 14:04:57 | 显示全部楼层 |阅读模式
本帖最后由 qinylj 于 2013-11-18 14:17 编辑

使用Ado对象读取Excel中的数据,但是为什么数据是从第二行开始读取的呢?
以下是代码,其实代码基本已经成型了,可以通过Ado形式读取Excel的数据,表名支持数字和表名称,但是就是GetRows方法读取的数据是从第二行开始的,而且第二行A2这个表格也是没有内容的。求大家帮助。
其中,$sFile为文件名,$sSheet为要读取的表序号或者名称,$iCount暂时还没用。
Func _ReadXls_New($sFile, $sSheet = 1, $iCount = "")
        Local $Tablecount
        Local $Tablearray[1]
        $Conn = ObjCreate("ADODB.Connection")
        $Cmd = ObjCreate("ADODB.Command")
        $Conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & $sFile & ";" & "Extended Properties=Excel 8.0")
        $Cmd.ActiveConnection = $Conn
        
        $Rs=$Conn.OpenSchema(20)
        While Not $Rs.Eof And Not $Rs.Bof
                If $Rs("TABLE_TYPE").Value = "TABLE" And Not StringRegExp($Rs("TABLE_NAME").Value, "\$_") And Not StringRegExp($Rs("TABLE_NAME").Value, "Print_Area") Then
                        ReDim $Tablearray[$Tablecount + 1]
                        $Tablearray[$Tablecount] = $Rs("TABLE_NAME").Value
                        $Tablecount += 1
                EndIf
                $Rs.MoveNext
        Wend
        
        If IsNumber($sSheet) Then
                If $sSheet = 0 Or $sSheet > UBound($Tablearray) Then Return @error
                $sSheet = $Tablearray[$sSheet - 1]
        Else
                $sSheet &= "$"
                $Sheetsearch = _ArraySearch($Tablearray, $sSheet)
                If $Sheetsearch = -1 Then Return @error
        EndIf
        
        $Cmd.CommandText = "SELECT * FROM [" & $sSheet & "]"
        $RsArray = $Cmd.Execute
        $RsArray = $RsArray.GetRows()
        _ArrayDisplay($RsArray)
        
        $Cmd.close
        $Conn.Close
        Return $RsArray
EndFunc   ;==>_ReadXls
发表于 2013-11-18 17:31:20 | 显示全部楼层
改成这样试下
$Conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & $sFile & ";" & "Extended Properties=Excel 8.0");HDR=no
对ado不太了解,猜可能是设置了第一行的标题行了,HDR=yes是指定标题行,no的话试下
 楼主| 发表于 2013-11-18 18:17:10 | 显示全部楼层
回复 2# kevinch


    感谢k哥,哈哈,可以了哈。
 楼主| 发表于 2013-11-18 18:26:50 | 显示全部楼层
Func _ReadXls_New($sFile, $sSheet = 1, $sRows= "", $sColumn = "", $eRows = "", $eColumn = "")
        Local $Tablecount
        Local $Tablearray[1]
        $Conn = ObjCreate("ADODB.Connection")
        $Cmd = ObjCreate("ADODB.Command")
        $Conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & $sFile & ";Extended Properties=" & '"Excel 8.0;HDR=No;IMEX=1"')
        $Cmd.LockType = 3
        $Cmd.CursorType = 2
        $Cmd.ActiveConnection = $Conn
        
        $Rs=$Conn.OpenSchema(20)
        While Not $Rs.Eof And Not $Rs.Bof
                If $Rs("TABLE_TYPE").Value = "TABLE" And Not StringRegExp($Rs("TABLE_NAME").Value, "\$_") And Not StringRegExp($Rs("TABLE_NAME").Value, "Print_Area") Then
                        ReDim $Tablearray[$Tablecount + 1]
                        $Tablearray[$Tablecount] = $Rs("TABLE_NAME").Value
                        $Tablecount += 1
                EndIf
                $Rs.MoveNext
        Wend
        
        If IsNumber($sSheet) Then
                If $sSheet = 0 Or $sSheet > UBound($Tablearray) Then Return @error
                $sSheet = $Tablearray[$sSheet - 1]
        Else
                $sSheet &= "$"
                $Sheetsearch = _ArraySearch($Tablearray, $sSheet)
                If @error Then Return @error
;~                 If $iCount <> "" Then 
        EndIf
        
        $Cmd.CommandText = "SELECT * FROM [" & $sSheet & "]"
        $RsArray = $Cmd.Execute
        $RsArray = $RsArray.GetRows()
        _ArrayDisplay($RsArray)
        
        $Cmd.close
        $Conn.Close
        Return $RsArray
EndFunc   ;==>_ReadXls
这是修改好的代码,不过还有点问题,就是Excel的排序方式和我们看见的排序方式不一样。
例如我有三个表,一个叫sheet1,一个叫2012,,还有一个叫我的Excel表,三者在Excel打开时看到的顺序为Sheet1,2012,我的Excel表,但是通过Ado形式读取时顺序为2012,Sheet1,我的Excel表。
发表于 2013-11-18 18:33:36 | 显示全部楼层
排序估计没办法了,数据库本就是个喜欢排序的东西,如果不调用excel对象也没办法对应上表名,如果用表名的方式又不够灵活,两权选择

不过奇怪,同样的问题为什么没想过直接用excel来读取呢?
 楼主| 发表于 2013-11-18 20:58:04 | 显示全部楼层
回复 5# kevinch


    这个可以不调用Excel.application对象对Excel大量数据进行快速的读取,而且也可以像数据库一样操作Excel表,通过各种语句查询符合条件的数据。另外貌似可以在操作过程中打开其他的Excel表格,不会干扰当前脚本的读取工作,而利用Excel.application对象打开时貌似不能新开其他Excel表。
发表于 2013-11-18 21:12:31 | 显示全部楼层
ado查询速度快我倒是承认,不过要说大量数据读取excel也可以直接读入数组里的,另外你说的excel.application操作过程中不能新开excel表格是不是因为用的activesheet之类的方式读取啊,其实你可以试一下objget直接读取一个excel工作簿
 楼主| 发表于 2013-11-19 00:48:58 | 显示全部楼层
回复 7# kevinch


    嗯,好像是用的Activesheet的方式,而且貌似Au3的UDF里面大部分也都是Activesheet吧,我试了一下,有些疑惑:
                $excel = ObjCreate("excel.application")
                If @error Then Exit
                $excel.visible = False
                $excel.DisplayAlerts = False
                $excel.ScreenUpdating = False
                $wb = $excel.workbooks.add
                With $wb.Sheets(1)
                        .range("B:G").NumberFormatLocal = "@"
                        .range("A:H").VerticalAlignment = -4108
上面是部分新建Excel的代码,没有使用Activesheet的方式,但是我打开其他Excel时什么都看。
发表于 2013-11-19 06:21:06 | 显示全部楼层
activesheet加个前缀就好了,比如上面的$wb.activesheet,这样就指定了对应工作簿的活动工作表,否则是整个application当前的活动工作表,良好的界定情况下你是可以随便查看其他工作簿内容的,并不影响当前程序对指定工作簿的操作
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-3 20:35 , Processed in 0.081126 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表