批量处理指定目录Excel文件脚本无终端输出问题求助
问题分析与解决方案
核心问题(终端无输出的直接原因)
- 入口判断错误:
if __name__ == "main":应改为if __name__ == "__main__"(双下划线),否则代码逻辑块根本不会执行。 - Path导入错误:
from pathlib import path应为from pathlib import Path(类名大写),否则调用Path.home()会触发NameError,直接终止程序且无输出。
其他问题与优化点
- 文件类型过滤缺失:
os.listdir('.')会获取目录下所有文件,需筛选出Excel文件(.xls/.xlsx),避免尝试打开非Excel文件报错。 - openpyxl格式支持限制:openpyxl仅支持
.xlsx/.xlsm格式,若要处理.xls文件,需改用xlrd+xlwt库(注意xlrd 2.0+不再支持.xls,需安装xlrd==1.2.0)。 - 公式写法错误:原公式
=IF(M="","","Confirmed")未指定行号,无法正确关联对应行的M列单元格,需根据当前行生成带行号的公式。 - 冗余代码:
while True循环无意义(循环内直接sys.exit()),可直接移除;目录拼接代码可简化。
修正后的代码(处理.xlsx文件)
import openpyxl as xl import os from pathlib import Path if __name__ == "__main__": # 目标目录 desktop_folder = Path.home().joinpath("Desktop", "Excel Files") os.chdir(desktop_folder) # 筛选xlsx/xlsm文件 excel_files = [f for f in os.listdir('.') if f.lower().endswith(('.xlsx', '.xlsm'))] if not excel_files: print("目录下未找到xlsx/xlsm文件") exit() for file_name in excel_files: try: wb = xl.load_workbook(file_name) sheet = wb.active # 遍历所有行(从第2行开始,假设第1行是表头) for row in range(2, sheet.max_row + 1): m_cell = sheet.cell(row=row, column=13) # M是第13列 o_cell = sheet.cell(row=row, column=15) # O是第15列 # 直接写入值(如需公式则用下面注释行) o_cell.value = "Confirmed" if m_cell.value else "" # o_cell.value = f'=IF(M{row}="","","Confirmed")' wb.save(file_name) print(f"{file_name} 处理完成") except Exception as e: print(f"{file_name} 处理失败: {str(e)}")
处理.xls文件的代码(需安装xlrd==1.2.0和xlwt)
import xlrd import xlwt from xlutils.copy import copy import os from pathlib import Path if __name__ == "__main__": desktop_folder = Path.home().joinpath("Desktop", "Excel Files") os.chdir(desktop_folder) # 筛选xls文件 excel_files = [f for f in os.listdir('.') if f.lower().endswith('.xls')] if not excel_files: print("目录下未找到xls文件") exit() for file_name in excel_files: try: # 以只读模式打开xls文件 rb = xlrd.open_workbook(file_name, formatting_info=True) # 复制为可写对象 wb = copy(rb) sheet = wb.get_sheet(0) # 获取第一个工作表 # 遍历行(xlrd行索引从0开始,跳过表头行) for row in range(1, rb.sheet_by_index(0).nrows): m_value = rb.sheet_by_index(0).cell_value(row, 12) # M列是第12索引 # 设置O列值(第14索引) sheet.write(row, 14, "Confirmed" if m_value else "") wb.save(file_name) print(f"{file_name} 处理完成") except Exception as e: print(f"{file_name} 处理失败: {str(e)}")
内容的提问来源于stack exchange,提问作者Jose Daniel Rojas
相关产品推荐
相关产品推荐

