You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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。最好精准捕获特定异常类型,比如FileNotFoundErrorInvalidFileException,这样调试起来也更清晰。

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

火山引擎 最新活动