如何用openpyxl实现Excel仅加载保存一次?解决程序过慢问题
问题原因分析与解决建议
核心问题原因
- 语法错误导致保存未执行:你
main.py中的wb.save(f'{file_name}'缺少闭合括号),即便你没看到报错,不完整的语法也会直接阻止保存操作完成;也有可能这段代码因为前面逻辑的异常提前退出,根本没被执行到。 - 全局
wb未被正确初始化:你把wb = Workbook()放到createExcel.py全局作用域后,修改后的create_excel函数完全没对这个全局wb做初始化操作(原函数是创建工作表、设置表头的核心逻辑),相当于你一直在操作一个空的默认工作簿,即便保存也可能是无有效内容的空文件。 - 文件路径模糊导致找错位置:如果
main.py中的file_name没有指定完整路径,文件会被保存到程序运行的当前工作目录(不一定是你认为的项目根目录,比如IDE的默认运行目录可能和项目目录不一致),你大概率找错了地方。 - 数据插入函数未关联全局
wb:修改后的insert_sheet_X_data函数没有明确操作全局的wb对象,可能存在局部变量覆盖或未正确写入的情况。
具体解决步骤
1. 修复保存语句的语法错误
确保main.py中的保存代码完整,同时补上原代码的.xlsx后缀:
# main.py wb.save(f'{file_name}.xlsx') # 补全闭合括号,添加文件后缀
2. 修正create_excel函数,操作全局wb
修改createExcel.py的create_excel函数,让它对全局wb执行初始化逻辑(保留原代码创建工作表、设置表头的逻辑):
# createExcel.py from openpyxl import Workbook wb = Workbook() def create_excel(file_name): global wb # 声明使用全局变量wb # 保留原代码中的初始化逻辑,比如删除默认Sheet、创建自定义工作表、设置表头 if 'Sheet' in wb.sheetnames: wb.remove(wb['Sheet']) # 示例:创建Sheet1并设置表头 sheet1 = wb.create_sheet('Sheet1') sheet1.append(['ID', '名称', '数值']) # ... 其他原有的工作表创建、格式设置逻辑 # 注意:此处不要调用save
3. 确保所有数据插入函数操作全局wb
每个insert_sheet_X_data函数都要声明使用全局wb,避免操作局部对象:
# createExcel.py def insert_sheet_1_data(array): global wb sheet = wb['Sheet1'] # 保留原代码的数据写入逻辑,比如遍历数组逐行写入 for row in array: sheet.append(row)
4. 确认文件保存路径
在main.py保存前,打印当前工作目录和完整保存路径,避免找错位置:
# main.py import os import createExcel # ... 其他业务代码 file_name = "处理结果" # 打印路径信息 print(f"当前运行目录:{os.getcwd()}") full_save_path = os.path.join(os.getcwd(), f'{file_name}.xlsx') print(f"文件将保存到:{full_save_path}") # 执行保存 createExcel.wb.save(full_save_path)
根据打印的路径去查找文件即可。
5. 验证工作簿内容(可选)
在保存前添加内容校验,确认数据已正确写入全局wb:
# main.py wb = createExcel.wb print(f"已创建的工作表:{wb.sheetnames}") print(f"Sheet1的有效行数:{wb['Sheet1'].max_row}") wb.save(f'{file_name}.xlsx')
如果行数仅为1(只有表头),说明数据插入逻辑未正确写入全局对象,需要排查insert_sheet_X_data函数的代码。
内容的提问来源于stack exchange,提问作者Dustin Y
相关产品推荐
相关产品推荐

