自己写的excel对比工具,直接写数据可以识别,通过gui界面输入的数据就不行(已解决)
本帖最后由 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]
For $i = 1 To $FileList1
$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]
For $i = 1 To $FileList2
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
搞了2天了,不知道原因,请大拿帮帮忙!!!感激不尽 主要看117到133行就可以,有木有人帮个忙? 主要看117到133行就可以,有木有人帮个忙? 回复 4# cynthia59
可不可以把你測試不行的
$sFilePath1, $sFilePath2
與 $file1, $file2,
這兩個實際 變數運行後的結果 列出來看看 说实话,压根就没看懂lz到底要干什么 回复 6# netegg
他的重點是
使用$sFilePath1, $sFilePath2這兩個變數直接 賦值 給 XLS 路徑他的函數可以跑
但是 他從GUI 裡面讓 USER 自己輸入的$file1, $file2變數函數就會出問題 回复 7# kk_lee69
那更不对呀, $sFilePath1, $sFilePath2是全路径,$file1, $file2输入的是文件名呀 回复 5# kk_lee69
我输出对比过,完全一样的 回复kk_lee69
那更不对呀, $sFilePath1, $sFilePath2是全路径,$file1, $file2输入的是文件名呀
netegg 发表于 2015-5-7 16:25 http://www.autoitx.com/images/common/back.gif
$file1 = $var_1 & '\' & $FileList1[$i]
这个$file1是路径加文件名,没有错的 回复 9# cynthia59
可不可以把你實際測試的結果 秀出來看看
順便要看一下你的路徑在哪邊.....
我需要你實際測試的結果 跟路徑.................. 回复cynthia59
可不可以把你實際測試的結果 秀出來看看
順便要看一下你的路徑在哪邊.....
我需要 ...
kk_lee69 发表于 2015-5-12 09:08 http://www.autoitx.com/images/common/back.gif
为什么不让贴图了 本帖最后由 cynthia59 于 2015-5-12 09:22 编辑
http://pan.baidu.com/s/1mgBrbwG
我把截图放这里了,麻烦帮我看一下,谢谢 回复 13# cynthia59
先試著 把事情弄單純點..... 把檔案 放在 C:\ 底下的 目錄A裡面在測試
本來以為是多空格少空格的問題
現在看來不是.... 照理說 應該不會這樣
盡量減少變數可以用常量替代的 直接先輸入 常量替代
目的為了測試是不是 $sFilePath1, $sFilePath2 $file1, $file2 這四個變數差異的原因
函數的其他變數 請改成 常數 直接輸入 測試 回复cynthia59
先試著 把事情弄單純點..... 把檔案 放在 C:\ 底下的 目錄A裡面在測試
本來以為是...
kk_lee69 发表于 2015-5-12 09:37 http://www.autoitx.com/images/common/back.gif
试了一下,是中间两个“10”的问题,其它4个变量是可以的,那这里输入的10会有什么问题?
页:
[1]
2