← Volver al blog

GUI to send data to an Excel file with Python

Crear una interfaz gráfica con Tkinter para capturar datos desde un formulario y escribirlos en una hoja de Excel con openpyxl — típico caso de uso: recoger registros en planta, laboratorio o encuestas sin depender de herramientas propietarias.

La clase ConnectExcel arma una ventana minimalista con 3 campos (Email, Dirección, Género), 3 botones (Abrir archivo, Enviar, Guardar cambios) y persiste todo en un .xlsx.

import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from tkinter.ttk import Combobox
from openpyxl import load_workbook

class ConnectExcel:
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry('480x210+440+240')
        self.root.configure(bg = '#8CD4D7')
        self.root.title('Connect Excel')

        #Labels
        self.label1 = tk.Label(self.root, text = "Email", bg = '#8CD4D7')
        self.label1.place(x = 140, y = 40)
        self.label2 = tk.Label(self.root, text = "Address", bg = '#8CD4D7')
        self.label2.place(x = 140, y = 60)
        self.combobox_label3 = tk.Label(self.root, text = "Gender", bg = '#8CD4D7')
        self.combobox_label3.place(x = 140, y = 80)

        #Entries
        self.entry1 = tk.Entry(self.root, width = 23)
        self.entry1.place(x = 225, y = 40)
        self.entry2 = tk.Entry(self.root, width = 23)
        self.entry2.place(x = 225, y = 60)

        #Combobox
        self.combobox = Combobox(self.root, values = ['M', 'F'], state = 'r', width = 20)
        self.combobox.place(x = 225, y = 80)
        self.combobox.set('M')

        #Buttons
        self.open_file_button = tk.Button(self.root, text = "Open file", command = self.open_excel)
        self.open_file_button.place(x = 4, y = 4)
        self.submit_button = tk.Button(self.root, text = "Send", command = self.send_data)
        self.submit_button.place(x = 190, y = 160)
        self.save_button = tk.Button(self.root, text = "Save changes", command = self.save_changes)
        self.save_button.place(x = 260, y = 160)

        self.root.mainloop()

    def open_excel(self):
        try:
            self.file_path = filedialog.askopenfilename()
            self.workbook = load_workbook(filename = self.file_path)
            self.sheet = self.workbook.active
        except Exception as e:
            print(f'The error is: {e}')

    def save_changes(self):
        try:
            self.workbook.save(filename = self.file_path)
        except:
            messagebox.showinfo("Notification", "Add an Excel file to save the data.")

    def send_data(self):
        try:
            data1 = self.entry1.get()
            data2 = self.entry2.get()
            data3 = self.combobox.get()

            row = [data1, data2, data3]
            self.sheet.append(row)
            self.entry1.delete(0, tk.END)
            self.entry2.delete(0, tk.END)
        except:
            messagebox.showinfo("Notification", "Add an Excel file to start data storage.")

if __name__ == '__main__':
    ConnectExcel()

La ventana resultante (mockup):

Connect Excel GUI

Flujo de uso:

  1. El usuario pulsa Open file → filedialog.askopenfilename() abre un diálogo nativo del sistema. Se carga el .xlsx con openpyxl.load_workbook y se toma la hoja activa.
  2. Escribe los datos y pulsa Send → send_data() lee los tres campos, construye una fila y la añade al final con sheet.append(row). También limpia los Entry para la siguiente captura.
  3. Cuando termine de cargar registros, pulsa Save changes → workbook.save(file_path) persiste todo al disco.

Puntos de diseño a destacar:

  • Separar apertura y guardado permite acumular varias filas en memoria antes de escribir a disco — evita abrir/cerrar el archivo en cada registro y reduce riesgo de corrupción.
  • Los try/except alrededor de open_excel y send_data protegen al usuario del error más común: pulsar "Send" sin haber abierto un archivo primero.
  • Combobox con state='r' (readonly) evita que el usuario tipee un valor fuera del dominio válido (M, F).

Mejoras naturales:

  • Validar el email con una regex antes de guardar
  • Agregar una fila de encabezado automática si el archivo está vacío
  • Usar ttk.Entry en vez de tk.Entry para respetar el theme del sistema
  • Mostrar la ruta del archivo abierto en la barra inferior

Instalación:

pip install openpyxl

tkinter viene incluido con Python en Windows y Mac. En Linux, sudo apt install python3-tk.

← Volver al blog