Ado读取Excel中的数据为什么是从第二行开始的呢?
本帖最后由 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
$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 改成这样试下$Conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & $sFile & ";" & "Extended Properties=Excel 8.0");HDR=no对ado不太了解,猜可能是设置了第一行的标题行了,HDR=yes是指定标题行,no的话试下 回复 2# kevinch
感谢k哥,哈哈,可以了哈。 Func _ReadXls_New($sFile, $sSheet = 1, $sRows= "", $sColumn = "", $eRows = "", $eColumn = "")
Local $Tablecount
Local $Tablearray
$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表。 排序估计没办法了,数据库本就是个喜欢排序的东西,如果不调用excel对象也没办法对应上表名,如果用表名的方式又不够灵活,两权选择
不过奇怪,同样的问题为什么没想过直接用excel来读取呢? 回复 5# kevinch
这个可以不调用Excel.application对象对Excel大量数据进行快速的读取,而且也可以像数据库一样操作Excel表,通过各种语句查询符合条件的数据。另外貌似可以在操作过程中打开其他的Excel表格,不会干扰当前脚本的读取工作,而利用Excel.application对象打开时貌似不能新开其他Excel表。 ado查询速度快我倒是承认,不过要说大量数据读取excel也可以直接读入数组里的,另外你说的excel.application操作过程中不能新开excel表格是不是因为用的activesheet之类的方式读取啊,其实你可以试一下objget直接读取一个excel工作簿 回复 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时什么都看。 activesheet加个前缀就好了,比如上面的$wb.activesheet,这样就指定了对应工作簿的活动工作表,否则是整个application当前的活动工作表,良好的界定情况下你是可以随便查看其他工作簿内容的,并不影响当前程序对指定工作簿的操作
页:
[1]