保存Pandas DataFrame至Excel后修改其他表致原表空值问题求助
问题原因
你使用了全局的workbook对象,在prepare_to_validate_sheet中通过pd.ExcelWriter修改并保存文件后,内存中的全局workbook并未同步更新,依然是加载文件时的旧状态。当你调用prepare_installation_sheet修改Installation表并保存时,实际是将旧状态的workbook覆盖到文件上,导致之前通过Pandas写入的To Validate表被还原为空。
解决方案
方案1:每个函数独立加载最新工作簿
避免依赖全局workbook,每个操作函数内部重新加载最新的Excel文件,确保操作的是文件的最新版本:
from openpyxl import load_workbook import pandas as pd def prepare_to_validate_sheet(): # 加载最新工作簿 workbook = load_workbook('excel_file.xlsx') dataframe = pd.read_csv('to_validate.csv', sep=';') writer = pd.ExcelWriter('excel_file.xlsx', engine='openpyxl', mode="a", if_sheet_exists="replace") writer.worksheets = dict((ws.title, ws) for ws in workbook.worksheets) dataframe.to_excel(writer, sheet_name='To Validate', index=False) writer.close() def prepare_installation_sheet(): # 重新加载最新的工作簿 workbook = load_workbook('excel_file.xlsx') installation_sheet = workbook['Installation'] installation_sheet.cell(row=1, column=1).value = installation_title installation_sheet.cell(row=4, column=1).value = installation_text workbook.save('excel_file.xlsx')
方案2:同步全局工作簿状态
如果必须使用全局workbook,在prepare_to_validate_sheet执行完成后,重新加载全局workbook,确保内存中的对象与磁盘文件状态同步:
from openpyxl import load_workbook import pandas as pd workbook = load_workbook('excel_file.xlsx') def prepare_to_validate_sheet(): global workbook dataframe = pd.read_csv('to_validate.csv', sep=';') writer = pd.ExcelWriter('excel_file.xlsx', engine='openpyxl', mode="a", if_sheet_exists="replace") writer.worksheets = dict((ws.title, ws) for ws in workbook.worksheets) dataframe.to_excel(writer, sheet_name='To Validate', index=False) writer.close() # 重新加载工作簿,同步内存与文件状态 workbook = load_workbook('excel_file.xlsx') def prepare_installation_sheet(): global workbook installation_sheet = workbook['Installation'] installation_sheet.cell(row=1, column=1).value = installation_title installation_sheet.cell(row=4, column=1).value = installation_text workbook.save('excel_file.xlsx')
补充说明
- 推荐使用方案1,避免全局变量带来的状态不同步问题,代码更健壮易维护。
- 两种方案的核心都是确保每次操作时,内存中的工作簿与磁盘上的文件保持一致,防止旧状态覆盖新修改。
内容的提问来源于stack exchange,提问作者macder
相关产品推荐
相关产品推荐

