openpyxl操作异常:重复运行未进入try块致Excel文件被覆盖
问题分析与解决方案
嘿,我一眼就揪出你代码里的核心问题啦!openpyxl这个库根本不支持旧版的.xls格式文件,它只针对.xlsx格式做了适配。所以哪怕test.xls已经存在,openpyxl.load_workbook('test.xls')还是会抛出异常,导致程序每次都跳去except块里重新创建工作簿,直接覆盖掉原有文件——这就是你丢失数据的元凶!
下面给你几个可行的解决方案:
方案一:改用.xlsx格式(最推荐)
这是最简单直接的路子,毕竟openpyxl对.xlsx的支持最完善。只需要修改文件名和代码对应部分就行:
import openpyxl from openpyxl.utils.exceptions import InvalidFileException try: # 换成xlsx格式文件名 wb = openpyxl.load_workbook('test.xlsx') print('成功打开现有文件') # 按需添加新工作表,先检查避免重复创建 if 'test2' not in wb.sheetnames: wb.create_sheet('test2') wb.save('test.xlsx') except FileNotFoundError: # 文件不存在时创建新文件 wb = openpyxl.Workbook() wb.create_sheet('test2') wb.save('test.xlsx') except InvalidFileException: print('文件格式无效,请确保是标准xlsx格式')
方案二:如果必须用.xls格式
要是你因为业务需求非得处理.xls文件,可以用专门适配旧格式的库组合:xlrd(读取)+xlwt(写入)+xlutils(修改现有文件)。先装依赖:
pip install xlrd xlwt xlutils
然后修改代码:
import xlrd from xlutils.copy import copy import os file_path = 'test.xls' if os.path.exists(file_path): # 文件存在时,读取后复制并添加新工作表 rb = xlrd.open_workbook(file_path, formatting_info=True) wb = copy(rb) # 检查工作表是否已存在,避免重复创建 sheet_names = [sheet.name for sheet in rb.sheets()] if 'test2' not in sheet_names: wb.add_sheet('test2') wb.save(file_path) print('成功打开现有文件并添加工作表') else: # 文件不存在时创建新文件 wb = xlwt.Workbook() wb.add_sheet('test2') wb.save(file_path) print('创建新文件成功')
额外提醒:别用裸except
你原来的代码用了裸except,这会捕获所有异常(包括键盘中断、语法错误这类无关问题),很容易隐藏其他bug。最好精准捕获特定异常类型,比如FileNotFoundError、InvalidFileException,这样调试起来也更清晰。
内容的提问来源于stack exchange,提问作者UserA




