使用openpyxl批量处理xlsx文件出现写入已关闭文件错误求助
问题分析与解决方案
你的代码出现ValueError: write to closed file错误,同时最终输出文件只会保留最后一个Excel的数据,核心问题出在输出工作簿的创建和保存时机错误,具体来说:
- 你在遍历每个源文件的循环内部,每次都新建
wb2 = Workbook(write_only=True)并调用wb2.save("output.xlsx")。write_only模式的工作簿在调用save()后就会被关闭,后续再对它操作就会触发“写入已关闭文件”的错误。 - 每次循环都新建输出工作簿,会直接覆盖之前的
output.xlsx,最终只能得到最后一个文件的提取结果。 - 代码没有过滤非xlsx文件,如果文件夹里有其他类型文件,加载时会报错。
修正后的代码
import openpyxl import os from openpyxl import load_workbook, Workbook # 源文件夹路径 source_path = 'C:/Users/User/Documents/Visual Studio 2017/DjangoWebProject1/DjangoWebProject1/app/rogaikopyta' # 创建输出工作簿(只写模式,适合大量数据写入) output_wb = Workbook(write_only=True) output_ws = output_wb.create_sheet() # 先写入表头(如果不需要可以删掉这行) output_ws.append(["B2单元格数据", "D2单元格数据"]) # 遍历文件夹内的所有文件 for filename in os.listdir(source_path): # 只处理xlsx文件 if not filename.endswith('.xlsx'): continue file_path = os.path.join(source_path, filename) try: # 只读模式加载源文件,节省内存 with load_workbook(file_path, read_only=True) as source_wb: source_ws = source_wb.active # 提取B2和D2的值(B是第2列,D是第4列,行都是2) b2_value = source_ws.cell(row=2, column=2).value d2_value = source_ws.cell(row=2, column=4).value # 追加到输出工作表 output_ws.append([b2_value, d2_value]) print(f"已处理文件:{filename}") except Exception as e: print(f"处理文件{filename}时出错:{str(e)}") continue # 最后一次性保存输出文件 output_wb.save("output.xlsx") print("所有文件处理完成,结果已保存到output.xlsx")
关键改进点
- 将输出工作簿的创建和保存移到循环外:只创建一次输出工作簿,遍历所有文件时持续追加数据,最后统一保存,避免重复创建/关闭文件导致的错误。
- 过滤非xlsx文件:通过
filename.endswith('.xlsx')跳过无关文件,防止加载非Excel文件引发异常。 - 添加异常处理:单个文件处理失败时不会中断整个程序,还能打印错误信息方便排查。
- 简化单元格提取逻辑:直接通过
cell(row=2, column=2)获取B2值,比iter_rows更直观高效。
内容的提问来源于stack exchange,提问作者Anna Ghildina
相关产品推荐
相关产品推荐

