找回密码
 加入
搜索
查看: 2600|回复: 7

[网络通信] [已解决]请教操作Excel的一些问题

[复制链接]
发表于 2021-5-30 14:01:16 | 显示全部楼层 |阅读模式
本帖最后由 zhaoceshi 于 2021-6-5 21:46 编辑

有2个问题想请教下各位大神们。
一是,在使用Excel函数去读取Excel表里的数据,比如sheet1表的B列,然后把数据写入新建文本里面,发现效率很慢。看看大神有没有高效的操作方法?
二是,在使用$oWorkbook.Worksheets("sheet4").Usedrange.Columns 函数时,如果Excel表格里没有"sheet4"表,脚本就会直接报错退出运行。有没有方法可以判断没有指定的表格就直接跳过?

=======6.1
今天发现,Excel函数是不是有问题?只用用for循环函数循环多几次(3-6次)就会报变量错误,如果是手动运行多少次都不会。真是奇怪。
使用64位编辑就不会报错



大致代码如下:
#include <Array.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>
;~ opt("MustDeclareVars", 1)
Local $7z = "c:\222\7z.exe", $date = "c:\统计", $sfile, $sname, $a = 1
$sfile = FileFindFirstFile($date & "*.zip")
While 1
        $sname = FileFindNextFile($sfile)
        If @error Then ExitLoop
        $a = $a
        RunWait(@ComSpec & " /c " & $7z & " x " & $date & $sname & " -o" & $date & "\解压后" & $a & "-" & StringReplace($sname, ".zip", "") & " -aoa", "", @SW_HIDE) ;
        FileWriteLine($date & "\run.log",$a & "-" & StringReplace($sname, ".zip", ""))
        Local $oExcel = _Excel_Open() ;(True,True) 为提示,否则
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "错误", "创建 Excel 应用对象发生错误." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
        Local $oWorkbook = _Excel_BookOpen($oExcel, $date & "\解压后" & $a & "-" & StringReplace($sname, ".zip", "")&"\index.xls",True,False)
        If @error Then
                MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeRead 示例", "打开工作簿发生错误 '" & $date & "\解压后" & $a & "-" & StringReplace($sname, ".zip", "")&"\index.xls" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
                _Excel_Close($oExcel)
                Exit
        EndIf
        Local $ip = _Excel_RangeRead($oWorkbook,Default, $oWorkbook.Worksheets("sheet1").Usedrange.Columns("b:b")) ;$oWorkbook.ActiveSheet.Usedrange.Columns("b:b"))
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeRead 示例 3", "读工作簿失败." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
        For $i = 0 To UBound($ip) - 1
                If $ip[$i] = "" Or $ip[$i] = "错误" Then ContinueLoop
                FileWriteLine($date&"关注信息.txt", $ip[$i])
        Next
        Local $ld = _Excel_RangeRead($oWorkbook,Default, $oWorkbook.Worksheets("sheet4").Usedrange.Columns("d:K"))
        If @error Then ContinueLoop
        For $i = 0 To UBound($ld) - 1
                If $ld[$i][7] = "影响" Or  $ld[$i][7] = "" Then ContinueLoop
                FileWriteLine($date&$ld[$i][0]&".txt",$ld[$i][7])
        Next
        $a = $a + 1
        _Excel_BookClose($oWorkbook,False)
        _Excel_Close($oExcel)

WEnd

发表于 2021-5-30 16:23:12 | 显示全部楼层
写入:_Excel_RangeWrite
; 显示特定工作簿的所有工作表清单
Local $aWorkSheets = _Excel_SheetList($oWorkbook) 读取表名后 做个判断
发表于 2021-5-30 21:20:49 | 显示全部楼层
B:B会把没有用到的空白单元格也读取出来,影响效率,还是要指定一下行号。
发表于 2021-5-31 10:02:55 | 显示全部楼层
1:读取显示列表Listview写入後TXT
2:读取表名显示GUICtrlCreateInput后做判断




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2021-5-31 13:07:42 | 显示全部楼层
zch11230 发表于 2021-5-30 21:20
B:B会把没有用到的空白单元格也读取出来,影响效率,还是要指定一下行号。

$oWorkbook.ActiveSheet.Usedrange.Columns  这一代码是可以获取到有数据的最大行和列,也就是说,你表格只有5000行,那么就指挥现在B1:B5000的数据,而不会显示6万多行的数据。
 楼主| 发表于 2021-5-31 13:19:17 | 显示全部楼层
chzj589 发表于 2021-5-30 16:23
写入:_Excel_RangeWrite
; 显示特定工作簿的所有工作表清单
Local $aWorkSheets = _Excel_SheetList($oW ...

是的,_Excel_SheetList可以解决第二个问题了,感谢,一直没留意这个函数。
 楼主| 发表于 2021-5-31 13:51:44 | 显示全部楼层
chzj589 发表于 2021-5-31 10:02
1:读取显示列表Listview写入後TXT
2:读取表名显示GUICtrlCreateInput后做判断

也是一个思路,多谢
发表于 2021-6-7 09:05:56 | 显示全部楼层
VB又快又省事,然后就是数组处理的事了
func r_exc($ex_p);读取EXCEL(路径)
        if FileExists($ex_p) then
        $xls= ObjGet($ex_p)
        With $xls.activesheet
                        $xls_su = .usedrange.value
                        $xls_su = .parent.application.transpose($xls_su)
                        .parent.close(False)
        EndWith
Return $xls_su
EndIf
EndFunc
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-5 00:19 , Processed in 0.072768 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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