Python遍历文件夹批量修改Excel时仅首个xlsx文件生效问题
批量处理Excel仅生效第一个文件的问题排查
核心错误原因
- 最直接的问题是
return语句缩进错误:当前代码中return和if判断保持同缩进,属于for循环的内部代码块,第一轮循环执行完成后(不管有没有匹配到xlsx格式文件)就会直接终止整个函数运行,根本不会继续遍历后续文件。 - 存在多个会触发运行报错的隐性代码错误,会导致程序在处理第一个文件时(甚至没开始处理就)中断:
os.chdir()的返回值是None,你将其赋值给path变量后,os.listdir(path)实际传入的是None,虽然默认会枚举当前工作目录,但写法完全不规范,极易出现路径匹配错误。- openpyxl中
wb.active是工作簿的属性,不是可调用方法,加括号写成wb.active()会触发类型错误。 - Excel单元格不存在
08这类带前导零的行号地址,行号从1开始计数,sheet['08']属于无效单元格引用,会直接抛错中断程序。
修正后可运行代码
import os from openpyxl import load_workbook from openpyxl.utils import get_column_letter def sumOfCosts(): # 先定义目标路径,再切换工作目录 target_path = r'C:\Users\salvarai\AppData\Roaming\Python\Python310\site-packages\COSTBOMS' os.chdir(target_path) for file in os.listdir(target_path): if file.endswith(".xlsx"): wb = load_workbook(filename=file) sheet = wb.active # 去掉括号,active是属性不是方法 sheet['H8'].value = "Total Cost=" # 修正无效单元格地址 char = get_column_letter(8) sumchar = get_column_letter(16) sheet[sumchar+"8"] = f"=SUM({char}2:{char}1000)" wb.save(file) wb.close() # return移到循环外部,所有文件遍历完成后再退出函数 return
额外优化建议
如果不需要切换全局工作目录,可以直接拼接文件绝对路径处理,避免影响其他路径相关逻辑,写法更稳妥:
def sumOfCosts(): target_path = r'C:\Users\salvarai\AppData\Roaming\Python\Python310\site-packages\COSTBOMS' for file in os.listdir(target_path): if file.endswith(".xlsx"): file_path = os.path.join(target_path, file) wb = load_workbook(filename=file_path) sheet = wb.active sheet['H8'].value = "Total Cost=" char = get_column_letter(8) sumchar = get_column_letter(16) sheet[sumchar+"8"] = f"=SUM({char}2:{char}1000)" wb.save(file_path) wb.close() return
内容的提问来源于stack exchange,提问作者salvaraiza
相关产品推荐
相关产品推荐

