修复Python循环提取Excel行并生成独立文件时的AttributeError问题
问题原因分析
你遇到的AttributeError: 'Worksheet' object has no attribute 'row_values'是因为row_values()并不是openpyxl库中Worksheet对象的方法——这个方法常见于xlrd或者pandas的相关对象中。另外你的原代码还有一个隐藏问题:每次循环没有重新加载header.xlsx,这样会导致后续生成的文件会累积之前添加的行(比如2.xlsx会是header+第1行+第2行,而不是你需要的header+第2行)。
修复后的完整代码
import os import openpyxl # 定义文件路径(统一提取路径,后续维护更方便) HEADER_PATH = r"C:\Users\kxz237\Desktop\test\header.xlsx" STATIONS_PATH = r"C:\Users\kxz237\Desktop\test\stations.xlsx" OUTPUT_DIR = r"C:\Users\kxz237\Desktop\test" # 预加载stations工作簿,避免循环内重复加载 stations_wb = openpyxl.load_workbook(STATIONS_PATH) stations_sh = stations_wb.active # 遍历stations的每一行,最多处理167行 for row_num in range(1, min(stations_sh.max_row + 1, 168)): # 每次循环重新加载header工作簿,保证每个新文件都基于原始header生成 header_wb = openpyxl.load_workbook(HEADER_PATH) header_sh = header_wb.active # 用openpyxl的方式获取当前行的所有单元格值 current_row_values = [cell.value for cell in stations_sh[row_num]] # 将当前行数据追加到header工作表 header_sh.append(current_row_values) # 生成动态输出文件名,替换循环变量到文件名中 output_file = os.path.join(OUTPUT_DIR, f"{row_num}.xlsx") # 保存新文件 header_wb.save(output_file) print("167个文件已全部生成完成!")
关键修改点说明
替换
row_values()的实现:
改用列表推导式[cell.value for cell in stations_sh[row_num]]来获取指定行的所有单元格值,这是openpyxl库中提取行数据的标准方式。循环内重新加载header工作簿:
把header_wb = openpyxl.load_workbook(HEADER_PATH)移到循环内部,确保每个新文件都是基于原始header.xlsx生成,不会累积之前添加的行数据。修正输出文件名的变量替换:
原代码中i.xlsx的i是静态字符串,不会自动替换为循环变量,改用f-stringf"{row_num}.xlsx"动态生成对应序号的文件名。限制处理行数到167行:
通过min(stations_sh.max_row + 1, 168)确保即使stations.xlsx行数超过167,也只会处理前167行,完全匹配你的需求。
效果验证
运行修复后的代码后,你会在目标目录下得到1.xlsx到167.xlsx的独立文件,每个文件的内容都是原始header.xlsx加上stations.xlsx中对应的单独一行数据,完全符合你的预期。
备注:内容来源于stack exchange,提问作者Kaiyuan Zheng

