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

Python openpyxl读取设备生成的xlsx文件报错,求批量处理方案

解决openpyxl无法读取设备生成的不规范XLSX文件问题

问题根源

设备生成的XLSX文件不符合严格的OOXML规范,尤其是样式定义部分(如Fill对象格式错误),导致openpyxl解析失败;而手动用Excel保存时,Excel会自动修复这些不规范格式,因此openpyxl能正常读取。


方案1:自动调用Excel批量修复文件格式

直接模拟手动保存的动作,用Python调用本地Excel程序批量修复文件格式,之后即可用openpyxl正常读取。

from pathlib import Path
import win32com.client as win32

# 获取当前目录下所有XLSX文件
path = Path(".")
xlsx_files = list(path.glob("*.xlsx"))

# 初始化Excel后台进程
excel = win32.gencache.EnsureDispatch("Excel.Application")
excel.Visible = False

try:
    for file in xlsx_files:
        # 打开文件并保存(自动修复格式)
        wb = excel.Workbooks.Open(str(file))
        wb.Save()
        wb.Close()
finally:
    excel.Quit()  # 关闭Excel进程

修复完成后,即可用你原来的openpyxl代码读取文件。


方案2:改用pandas读取文件

pandas对不规范XLSX文件的兼容性更强,无需提前修复即可直接读取数据,适合仅需提取单元格内容的场景。

from pathlib import Path
import pandas as pd

path = Path(".")
filesxlsx = path.glob('*.xlsx')

all_extracted_data = []
for filename in filesxlsx:
    # 读取第一个工作表(可根据需求修改sheet_name)
    df = pd.read_excel(filename, sheet_name=0)
    # 提取指定单元格内容,示例为A1、B2,需根据实际需求调整索引
    extracted = {
        "文件名": filename.name,
        "A1内容": df.iloc[0, 0],  # iloc[row索引, 列索引],Excel的A1对应(0,0)
        "B2内容": df.iloc[1, 1]
    }
    all_extracted_data.append(extracted)

# 将合并后的数据保存为新XLSX文件
result_df = pd.DataFrame(all_extracted_data)
result_df.to_excel("合并结果.xlsx", index=False)

方案3:openpyxl只读模式尝试(效果不稳定)

尝试用read_only=True和data_only=True模式打开,减少样式加载的影响,但仅对部分轻微不规范文件有效:

from pathlib import Path
import openpyxl

path = Path(".")
filesxlsx = path.glob('*.xlsx')

importeddataxlsx = []
for filename in filesxlsx:
    try:
        wb = openpyxl.load_workbook(filename, read_only=True, data_only=True)
        importeddataxlsx.append(wb)
    except TypeError:
        # 若仍报错,需改用方案1或2
        pass

内容的提问来源于stack exchange,提问作者Tea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:09:10