PySimpleGUI表单操作Excel双工作表:文件损坏无法导出数据
问题解决:Excel文件提交后损坏无法导出数据
问题场景
需求:用户填写表单后,将数据行追加到现有Excel文件的sheet1;点击按钮可查看sheet2的指定单元格。
问题:每次提交信息时文件损坏,无法正常导出数据,怀疑是工作表激活逻辑导致。
错误原因
代码同时使用pandas和openpyxl两个库对同一个Excel文件操作,且存在重复加载文件、未正确释放资源的问题:
Confirmar事件中,先通过pandas的to_excel写入文件,紧接着调用openpyxl的wb.save(),两个操作同时占用文件导致损坏- 初始化时加载的
workbook对象与Confirmar中重新加载的wb对象相互干扰
修复方案
统一使用openpyxl配合pandas处理Excel操作,避免跨库冲突;同时优化文件操作逻辑,确保每次操作都正确打开/释放文件资源。
修复后的完整代码
import openpyxl import pandas as pd import PySimpleGUI as sg EXCEL_FILE = 'example.xlsx' # 初始化界面 layout = [ [sg.Text('Por favor rellenar los siguientes campos:')], [sg.Text('Fecha de Inicio', size=(15,1)), sg.InputText(key='Fecha de Inicio')], [sg.Text('Hora de Inicio', size=(15,1)), sg.InputText(key='Hora de Inicio')], [sg.Button('Confirmar'), sg.Button('Limpiar'), sg.Button('Visualizar'), sg.Button('Salir')] ] window = sg.Window('Formulario', layout) def clear_input(values): for key in values: window[key]('') return None while True: event, values = window.read() if event == sg.WIN_CLOSED or event == 'Salir': break if event == 'Limpiar': clear_input(values) if event == 'Confirmar': # 读取sheet1数据并追加新行 df = pd.read_excel(EXCEL_FILE, sheet_name='sheet1') new_row = pd.DataFrame([{ 'Fecha de Inicio': values['Fecha de Inicio'], 'Hora de Inicio': values['Hora de Inicio'] }]) df = pd.concat([df, new_row], ignore_index=True) # 指定openpyxl引擎写入,避免格式冲突 df.to_excel(EXCEL_FILE, sheet_name='sheet1', index=False, engine='openpyxl') sg.popup('Informe enviado!') clear_input(values) if event == 'Visualizar': # 单独加载文件读取sheet2,操作完成后关闭释放资源 wb = openpyxl.load_workbook(EXCEL_FILE) sheet2 = wb['sheet2'] for value in sheet2.iter_rows(min_row=1, max_row=20, min_col=1, max_col=3, values_only=True): sg.Print(value) wb.close() window.close()
关键修改点
- 移除初始化时多余的workbook加载,改为按需加载文件
- 用
pd.concat替代已弃用的df.append方法(pandas 2.0+已移除append) - 写入Excel时指定
engine='openpyxl',确保与openpyxl操作兼容 Visualizar事件中操作完成后关闭工作簿,避免资源占用- 修复
clear_input函数的参数缺失问题
内容的提问来源于stack exchange,提问作者Dizok
相关产品推荐
相关产品推荐

