You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:32:46