You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:50:33