如何修复AutoIt脚本实现将50个Excel工作簿指定数据汇总到单个文件
AutoIt Excel数据迁移脚本故障修复
核心故障原因
- 工作表名称硬编码不兼容:源表读取指定了俄文表名
Данные,目标表写入指定了俄文表名Лист1,如果对应文件没有匹配名称的工作表,读写操作会直接失效,导致判断分支不会触发 - 字符串匹配无容错:直接全等匹配
Sample和Over limit,如果单元格内容存在前后空格、大小写差异、或者是其他语言的对应值,会直接跳过匹配分支,看起来就像单元格循环没有生效 - 写入参数笔误:三个目标列全部写入了
$sampletype变量,就算条件触发,写入的内容也是错误的 - 读写对象不一致:表头写入使用的是
$workbookDestiny.Activesheet动态对象,后续数据写入硬编码了表名,目标表名不匹配时写入会失败
修复后的完整代码
#include <file.au3> #include <Excel.au3> opt("WinTitleMatchMode", 2) $path = "C:\Users\User\Desktop\Nezavisimai\Papka2\" $FileListShort = _FileListToArray($path, "*.xlsx", 1, True) $ProgExcel = _Excel_Open() $workbookDestiny = _Excel_BookNew($ProgExcel) ; 直接复用激活的工作表对象,避免硬编码表名出错 $objDestSheet = $workbookDestiny.Activesheet $LineDestiny = 1 _Excel_RangeWrite($workbookDestiny, $objDestSheet, "Sample type", "A" & $LineDestiny) _Excel_RangeWrite($workbookDestiny, $objDestSheet, "Sample name", "B" & $LineDestiny) _Excel_RangeWrite($workbookDestiny, $objDestSheet, "Result", "C" & $LineDestiny) For $i = 1 to $FileListShort[0] $workbookSource = _Excel_BookOpen($ProgExcel, $FileListShort[$i], False, False) ; 先判断源文件是否存在Данные工作表,不存在就跳过当前文件 If Not _Excel_SheetExists($workbookSource, "Данные") Then _Excel_BookClose($workbookSource, False) ContinueLoop EndIf $objSourceSheet = $workbookSource.Sheets("Данные") For $LineSource = 2 to 30 ; 读取后先去除首尾空格,再转小写做匹配,提高容错 $sampletype = StringStripWS(_Excel_RangeRead($workbookSource, $objSourceSheet, "A" & $LineSource), 3) $samplename = _Excel_RangeRead($workbookSource, $objSourceSheet, "B" & $LineSource) $sampleresult = _Excel_RangeRead($workbookSource, $objSourceSheet, "C" & $LineSource) $sampleobs = StringStripWS(_Excel_RangeRead($workbookSource, $objSourceSheet, "D" & $LineSource), 3) ; 匹配改为不区分大小写的宽松匹配 If StringLower($sampletype) = "sample" Then If StringLower($sampleobs) <> "over limit" Then $LineDestiny = $LineDestiny + 1 ; 修正写入变量错误,三个列分别写入对应值 _Excel_RangeWrite($workbookDestiny, $objDestSheet, $sampletype, "A" & $LineDestiny) _Excel_RangeWrite($workbookDestiny, $objDestSheet, $samplename, "B" & $LineDestiny) _Excel_RangeWrite($workbookDestiny, $objDestSheet, $sampleresult, "C" & $LineDestiny) EndIf EndIf Next _Excel_BookClose($workbookSource, False) Next ; 可选:结束后保存目标文件 ; _Excel_BookSaveAs($workbookDestiny, "C:\目标路径\汇总结果.xlsx") ; _Excel_Close($ProgExcel)
调试建议
如果修复后仍然不生效,可以在判断分支前加一行调试输出ConsoleWrite("行号" & $LineSource & ":" & $sampletype & "|" & $sampleobs & @CRLF),运行后查看SciTE编辑器的控制台输出,就能明确看到每一行读取到的内容,快速定位匹配失败的原因。
内容的提问来源于stack exchange,提问作者Spec86
相关产品推荐
相关产品推荐

