找回密码
 加入
搜索
查看: 10271|回复: 21

[AU3基础] 自己写的excel对比工具,直接写数据可以识别,通过gui界面输入的数据就不行(已解决)

  [复制链接]
发表于 2015-5-5 16:07:48 | 显示全部楼层 |阅读模式
本帖最后由 cynthia59 于 2015-5-12 10:34 编辑

先在桌面建立两个文件夹分别为1和2,里面分别放一个叫1.xls的文件,两个文件要不一样
         $sFilePath1 = 'C:\Users\Administrator\Desktop\1\1.xls'
         $sFilePath2 = 'C:\Users\Administrator\Desktop\2\1.xls'
然后运行脚本,多余的代码已经删掉了,直接点“直接对比”按钮

脚本第132行,直接读定义好的数据,对比的时候就可以弹出第158行这里的调试信息,能读到excel里的数据
但是脚本第133行,读gui界面上输入的数据,对比的时候就弹不出来158行的调试信息,导致第161和162行里信息为空

请教一下是什么原因?应该怎么处理?
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#Include <ACN_String.au3>
#Include <File.au3>
#Include <Array.au3>
#Include <Clipboard.au3>
#Include <Excel.au3>


Opt ('GUIOnEventMode',1)

Global $var_1 = IniRead('Au3_ExcelDiff3.ini', '配置', '数据源1', 'C:\Users\Administrator\Desktop\1')
Global $var_2 = IniRead('Au3_ExcelDiff3.ini', '配置', '数据源2', 'C:\Users\Administrator\Desktop\2')
Global $var_3 = IniRead('Au3_ExcelDiff3.ini', '配置', '日志地址', 'C:\ExcelDiff.log')
;Global $var_4 = IniRead('Au3_ExcelDiff.ini', '配置', '安装目录', 'C:\Program Files\ComponentSoftware\ExcelDiff\ExcelDiff.exe')
Global $var_5 = IniRead('Au3_ExcelDiff3.ini', '配置', '对比列数', '10')        ;对比列数
Global $var_6 = IniRead('Au3_ExcelDiff3.ini', '配置', '空白行数', '10')        ;空白行数

; GUI
$parent = GuiCreate('批量对比EXCEL v3.0', 400, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, 'SpecialEvents')
GUISetOnEvent($GUI_EVENT_MINIMIZE, 'SpecialEvents')
GUISetOnEvent($GUI_EVENT_RESTORE, 'SpecialEvents')

$Label_0 = GuiCtrlCreateLabel('输入要对比的文件夹:', 10, 16)

$Label_1 = GuiCtrlCreateLabel('数据源1:', 10, 45)
$source_1 = GUICtrlCreateInput ( $var_1, 65 , 41 , 260 )
$Button_1 = GuiCtrlCreateButton('选择', 333, 39 , 60)
        GUICtrlSetOnEvent(-1, 'Choose_Source_1_Pressed')
        
$Label_2 = GuiCtrlCreateLabel('数据源2:', 10, 75)
$source_2 = GUICtrlCreateInput ( $var_2, 65 , 71 , 260 )
$Button_2 = GuiCtrlCreateButton('选择', 333, 69 , 60)
        GUICtrlSetOnEvent(-1, 'Choose_Source_2_Pressed')
        
$Label_3 = GuiCtrlCreateLabel('日志保存路径:', 10, 105)
$LogLocation = GUICtrlCreateInput ( $var_3, 10 , 125 , 315 ) 
$Button_3 = GuiCtrlCreateButton('选择', 333, 123 , 60)
    GUICtrlSetOnEvent(-1, 'Choose_LogLocation_Pressed')        
        
$Label_5 = GuiCtrlCreateLabel('需要对比的列数:', 10, 210, 100)        ;GUICtrlCreateLabel ( "文本", 左侧, 顶部 [, 宽度 [, 高度 [, 样式 [, 扩展样式]]]] ) 
$iColumn = GUICtrlCreateInput ( $var_5, 110 , 206 , 25)         ;GUICtrlCreateInput ( "文本", 左侧, 顶部 [, 宽度 [, 高度 [, 样式 [, 扩展样式]]]] ) 
$Label_6 = GuiCtrlCreateLabel('连续空白', 10, 235, 50)
$iRowBlank = GUICtrlCreateInput ( $var_6, 60 , 231 , 25 )         
$Label_7 = GuiCtrlCreateLabel('行算文件结束', 90, 235)

$Button_8 = GuiCtrlCreateButton('直接对比', 240, 260 , 150 )        ;GUICtrlCreateButton ( "文本", 左侧, 顶部 [, 宽度 [, 高度 [, 样式 [, 扩展样式]]]] ) 
    GUICtrlSetOnEvent(-1, 'Run_Pressed2')

Func Choose_Source_1_Pressed()
        
        $var_1 = FileSelectFolder('选择数据源1文件夹:', '')
        
        GUICtrlSetData ( $source_1, $var_1 )

EndFunc   ;==>Choose_Source_1_Pressed

Func Choose_Source_2_Pressed()
        
        $var_2 = FileSelectFolder('选择数据源2文件夹:', '')
        
        GUICtrlSetData ( $source_2, $var_2 )

EndFunc   ;==>Choose_Source_2_Pressed

Func Choose_LogLocation_Pressed()
        
        $var_3 = FileSelectFolder('选择日志保存路径:', '')
        
        If StringRight($var_3, 1) = '\' Then         $var_3 = StringTrimRight($var_3, 1)

        GUICtrlSetData ( $LogLocation, $var_3 & '\ExcelDiff.log' )

EndFunc   ;==>Choose_LogLocation_Pressed


Func Run_Pressed2()
        
WinSetState ( '批量对比EXCEL v3.0', '输入要对比的文件夹:', @SW_MINIMIZE ) 
        
;获取数据源1文件夹中的文件列表
Global $FileList1=_FileListToArray($var_1,'*',1)
        If @Error=1 Then
                MsgBox (0,"","数据源1文件夹不存在!")
                Exit
        EndIf
        If @Error=4 Then
                MsgBox (0,"","数据源1文件不存在!")
                Exit
        EndIf
;_ArrayDisplay($FileList1,"$FileList1")


;获取数据源2文件夹中的文件列表
Global $FileList2=_FileListToArray($var_2,'*',1)
        If @Error=1 Then
                MsgBox (0,"","数据源2文件夹不存在!")
                Exit
        EndIf
        If @Error=4 Then
                MsgBox (0,"","数据源2文件不存在!")
                Exit
        EndIf
;_ArrayDisplay($FileList2,"$FileList2")

;获取同名文件列表并对比文件

        Global $t_item1[$FileList1[0]]
                For $i = 1 To $FileList1[0]
                                        $file1 = $var_1 & '\' & $FileList1[$i]
                                        $file2 = $var_2 & '\' & $FileList1[$i]
                                If FileExists($var_2 & '\' & $FileList1[$i]) Then 
                                        
                                        $str1 = $file1 &@CRLF& $file2 &@CRLF& $var_5 &@CRLF& $var_6 &@CRLF& $var_3 &@CRLF& $var_1                        ;;调试
                                        MsgBox(0,'',$str1)                        ;;调试
                                        
                                         $sFilePath1 = 'C:\Users\Administrator\Desktop\1\1.xls'
                                         $sFilePath2 = 'C:\Users\Administrator\Desktop\2\1.xls'
                                         $iColumn = 10
                                         $iRowBlank = 10
                                         $LogLocation = 'C:\ExcelDiff.log'
                                         $source_1 = 'C:\Users\Administrator\Desktop\1'
                                         
                                     $str2 = $sFilePath1 &@CRLF& $sFilePath2 &@CRLF& $iColumn &@CRLF& $iRowBlank &@CRLF& $LogLocation &@CRLF& $source_1                        ;;调试
                                         MsgBox(0,'',$str2)                        ;;调试
                                         
                                         If StringCompare($str1,$str2) = 0 Then MsgBox(0,'','ok')                        ;;调试

                                        ;_ExcelDiff( $sFilePath1, $sFilePath2, $iColumn, $iRowBlank, $LogLocation, $source_1 )        ;这个就可以
                                        _ExcelDiff( $file1, $file2, $var_5, $var_6, $var_3, $var_1 )        ;这个就不行
                                        ;调用直接对比脚本
                                        ;Call ( '_ExcelDiff' , $file1, $file2, $var_5, $var_6, $var_3, $var_1 ) 
                                Else 
                                EndIf
                Next
        Global $t_item2[$FileList2[0]]
                For $i = 1 To $FileList2[0]
                                If not FileExists($var_1 & '\' & $FileList2[$i]) Then 
                                EndIf
                Next

WinSetState ( '批量对比EXCEL v3.0', '输入要对比的文件夹:', @SW_RESTORE  ) 

EndFunc   ;==>Run_Pressed2


Func _ExcelDiff( $sFilePath1, $sFilePath2, $iColumn, $iRowBlank, $LogLocation, $source_1 )
        
        $oExcel1= _ExcelBookOpen( $sFilePath1 , 0 , True )        ;True为只读模式。0为不可见,1为可见。
        $oExcel2= _ExcelBookOpen( $sFilePath2 , 0 , True )
        
        For $i=1 to _CountRow($oExcel1, $iRowBlank)
                $aArray1 = _ExcelReadArray($oExcel1, $i, 1, $iColumn, 0)
                $aArray2 = _ExcelReadArray($oExcel2, $i, 1, $iColumn, 0) 
                _ArrayDisplay($aArray1,'$aArray1')                        ;;调试
                $str1 = _ArrayToString($aArray1, @TAB)
                $str2 = _ArrayToString($aArray2, @TAB)
                MsgBox(0,'','$str1:' & $str1)                        ;;调试
                MsgBox(0,'','$str2:' & $str2)                        ;;调试
                $a = StringLen ( $source_1 ) +1
                $filename = StringTrimLeft ( $sFilePath1, $a )
                If StringCompare($str1, $str2) = 0 Then 
                Else 
                        $Same = 0
                        MsgBox(0,'','不同的行:' & $i & @CRLF & $str1 & @CRLF & $str2)                        ;;调试
                EndIf
        Next

        _ExcelBookClose($oExcel1)
        _ExcelBookClose($oExcel2)
        
EndFunc        

;~计算Excel有效行数,误差<$iRowBlank
Func _CountRow($oExcel,$iRowBlank)
        $sRow = 1
        While 1
                $n = 0
                For $i = 1 to $iRowBlank
                        $sCellvalue = _ExcelReadCell($oExcel, $sRow , 1)        ;~读取第一列的单元格内容
                        If $sCellvalue = '' Then $n = $n + 1
                        $sRow = $sRow + 1
                Next
                If $n = $iRowBlank Then 
                        Return $sRow - $iRowBlank -1
                        Exit 
                EndIf
        WEnd
EndFunc

; SpecialEvents
Func SpecialEvents()
        Select
                Case @GUI_CtrlId = $GUI_EVENT_CLOSE
                        Exit

                Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE

                Case @GUI_CtrlId = $GUI_EVENT_RESTORE

        EndSelect
EndFunc   ;==>SpecialEvents

; GUI MESSAGE LOOP
GuiSetState()
While GuiGetMsg() <> $GUI_EVENT_CLOSE
WEnd
 楼主| 发表于 2015-5-5 16:10:06 | 显示全部楼层
搞了2天了,不知道原因,请大拿帮帮忙!!!感激不尽
 楼主| 发表于 2015-5-5 16:28:04 | 显示全部楼层
主要看117到133行就可以,有木有人帮个忙?
 楼主| 发表于 2015-5-5 16:28:09 | 显示全部楼层
主要看117到133行就可以,有木有人帮个忙?
发表于 2015-5-6 09:58:10 | 显示全部楼层
回复 4# cynthia59

可不可以把你測試不行的

$sFilePath1, $sFilePath2

與 $file1, $file2,

這兩個實際 變數運行後的結果 列出來看看
发表于 2015-5-7 16:17:11 | 显示全部楼层
说实话,压根就没看懂lz到底要干什么
发表于 2015-5-7 16:21:01 | 显示全部楼层
回复 6# netegg

他的重點是

使用  $sFilePath1, $sFilePath2  這兩個變數  直接 賦值 給 XLS 路徑  他的函數可以跑

但是 他從  GUI 裡面讓 USER 自己輸入的  $file1, $file2  變數  函數就會出問題
发表于 2015-5-7 16:25:57 | 显示全部楼层
回复 7# kk_lee69
那更不对呀, $sFilePath1, $sFilePath2是全路径,$file1, $file2输入的是文件名呀
 楼主| 发表于 2015-5-12 08:58:31 | 显示全部楼层
回复 5# kk_lee69


    我输出对比过,完全一样的
 楼主| 发表于 2015-5-12 08:59:45 | 显示全部楼层
回复  kk_lee69
那更不对呀, $sFilePath1, $sFilePath2是全路径,$file1, $file2输入的是文件名呀
netegg 发表于 2015-5-7 16:25



    $file1 = $var_1 & '\' & $FileList1[$i]
这个$file1是路径加文件名,没有错的
发表于 2015-5-12 09:08:27 | 显示全部楼层
回复 9# cynthia59

可不可以把你實際測試的結果 秀出來看看
順便要看一下你的路徑在哪邊.....

我需要你實際測試的結果 跟路徑..................
 楼主| 发表于 2015-5-12 09:13:23 | 显示全部楼层
回复  cynthia59

可不可以把你實際測試的結果 秀出來看看
順便要看一下你的路徑在哪邊.....

我需要 ...
kk_lee69 发表于 2015-5-12 09:08


为什么不让贴图了
 楼主| 发表于 2015-5-12 09:14:54 | 显示全部楼层
本帖最后由 cynthia59 于 2015-5-12 09:22 编辑

http://pan.baidu.com/s/1mgBrbwG
我把截图放这里了,麻烦帮我看一下,谢谢
发表于 2015-5-12 09:37:46 | 显示全部楼层
回复 13# cynthia59

先試著 把事情弄單純點..... 把檔案 放在 C:\ 底下的 目錄A裡面在測試

本來以為是  多空格少空格的問題

現在看來不是.... 照理說 應該不會這樣

盡量減少變數  可以用常量替代的 直接先輸入 常量替代

目的為了測試  是不是 $sFilePath1, $sFilePath2   $file1, $file2   這四個變數差異的原因
函數的其他變數 請改成 常數 直接輸入 測試
 楼主| 发表于 2015-5-12 10:01:50 | 显示全部楼层
回复  cynthia59

先試著 把事情弄單純點..... 把檔案 放在 C:\ 底下的 目錄A裡面在測試

本來以為是  ...
kk_lee69 发表于 2015-5-12 09:37



试了一下,是中间两个“10”的问题,其它4个变量是可以的,那这里输入的10会有什么问题?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 03:53 , Processed in 0.130456 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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