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
相关产品推荐
相关产品推荐

