求助:遍历多工作表Excel文件,删除指定行列后导出为CSV
问题分析与修正方案
你的代码核心错误点:
- 混淆了工作表名称(字符串)与工作表对象:
workbook.sheetnames返回的是字符串列表,循环中的sheet是名称而非可操作的工作表实例,必须通过workbook[sheet]获取实际工作表对象。 - 未定义
mrts_worksheet就直接调用,导致变量未定义错误。 - 删除行顺序错误:删除上方行会导致下方行索引偏移,必须从底部往顶部删行才能保证索引正确。
delete_rows调用语法错误:正确用法是工作表对象.delete_rows(起始行, 行数),不需要嵌套调用。- 多余的
file_handle.close():with上下文管理器会自动关闭文件,无需手动调用。
最简实现代码(仅依赖openpyxl+csv,无额外依赖)
import openpyxl import csv # 加载工作簿,data_only=True读取单元格实际值而非公式 workbook = openpyxl.load_workbook("C:/Users/example.xlsx", data_only=True) # 遍历所有工作表 for sheet_name in workbook.sheetnames: ws = workbook[sheet_name] # 按从下到上顺序删除行,避免索引偏移 ws.delete_rows(72, 79) # 删除72-150行(共150-72+1=79行) ws.delete_rows(6, 1) # 删除原第6行 ws.delete_rows(1, 4) # 删除前4行 ws.delete_cols(1, 1) # 删除第一列 # 给指定单元格赋值(注意删除行后原位置已偏移,此处为删除后的B5) ws['B5'] = "Diff Label" # 导出为CSV文件 csv_path = f"C:/Users/example_{sheet_name}.csv" with open(csv_path, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 直接读取行值写入,无需逐个单元格提取 for row in ws.iter_rows(values_only=True): writer.writerow(row)
补充说明:
- 如果需要兼容
.xls格式,可安装xlrd==1.2.0(xlrd 2.0+不再支持xls),但处理逻辑不如openpyxl直观,优先推荐用openpyxl处理xlsx格式。 - 指定
encoding="utf-8"可避免导出CSV时出现中文乱码问题。
内容的提问来源于stack exchange,提问作者Awellkeptsecret
相关产品推荐
相关产品推荐

