尝试在 Python 中使用 PySimpleGUI 通过 openpyxl 读取 excel 单元格

Trying to read excel cells through openpyxl using PySimpleGUI in Python

我正在尝试让 PySimpleGUI 读取特定的 excel 单元格。虽然代码本身有效,但一旦与 PySimpleGUI 一起使用,它就不会 return 正确的单元格值。它仅 return 是 headers,而不是其他行。任何关于如何修复它的想法将不胜感激!

'''

import PySimpleGUI as sg
import openpyxl

sg.theme('DefaultNoMoreNagging')
layout =  [[sg.Text("Roster", pad=(30,30), font=("Arial", 30, 'bold'), size=(40,1), justification='c')],
          [sg.Text("Upload Roster", font=("Arial", 20, 'bold'), pad=(50,0), size=(17,1)), sg.Button("Browse", font='Arial 20'), sg.Text("Student ID", font=("Arial", 20, 'bold'), pad=(30,0), size=(10,1)), sg.InputText(key='ID', font="Arial 20", background_color="#F7F9F9", size=(10,1))],
          [sg.Text("Student Name", font=("Arial", 20, 'bold'), pad=(50,30), size=(17,1)), sg.Multiline(key='name', font="Arial 20", pad=(0,30), background_color="#F7F9F9", size=(15,1))]]
          
window = sg.Window("Roster", layout)

name = ''

while True:
    event,values = window.read()
    name = values['name']
    if event == "Cancel" or event == sg.WIN_CLOSED:
        break
    elif event == "Browse":

        sg.theme('DefaultNoMoreNagging')
        layout = [[sg.T('Source File', font=('Arial', 20,'bold'))],
                 [sg.In(key='input', size=(25,1), background_color="#F7F9F9", font='Arial 20'), sg.FilesBrowse(target='input',font='Arial 15')],
                 [sg.OK(font='Arial 15', key='OK'), sg.Exit(font='Arial 15')]]

        browse_window = sg.Window("File Browse", layout)
        

        while True:
            event,values = browse_window.read()
            roster = openpyxl.load_workbook('sample.xlsx')
            sheet = roster.active
            columns = sheet.columns
            
            if event == "Exit" or event == sg.WIN_CLOSED:
                break
            elif event == 'OK':
                                              
                if roster:
                    for row in sheet.rows:
                        if row[2].value == 'ID':
                            window['name'].print(row[1].value)
                            print("First Name: ".format(row[0].value))
                            break
                        else:
                            sg.popup_error("Record not found", font="Arial 20")
                            
            browse_window.close()
            
window.close()

'''

(这应该是评论) 删除所有与 PySimpleGUI 相关的东西,它只是掩盖了问题。 专注于 for 循环,让它工作。目前,它 处理 header 行,因为 if row[2].value == 'ID':

(已编辑)单独尝试:

    roster = openpyxl.load_workbook('sample.xlsx')
    sheet = roster.active
    for row in sheet.rows:
        print('{} {}'.format(row[0].value, row[1].value))

好的,我明白了。代码本身没问题。它不读取它应该读取的单元格的原因是 PySimpleGUI 需要知道那些 Excel 单元格是整数。所以我唯一做的就是添加 int(values['ID'])

我在代码里又做了一个mod。由于我已经使用 openpyxl.load_workbook 将 excel 文件导入到代码中,因此无需在 window 中浏览它。我取消了那部分。这是完整的功能代码:

import PySimpleGUI as sg
import openpyxl

roster = openpyxl.load_workbook('/home/superuser/Desktop/sample.xlsx')
sheet = roster.active  

sg.theme('DefaultNoMoreNagging')
#sg.theme('TanBlue')
#sg.theme('Material2')
layout =  [[sg.Text(pad=(150,30), font=("Arial", 20, 'bold'), size=(15,1))],
          [sg.Text("Student ID:", font=("Arial", 15, 'bold'), pad=(20,0), size=(12,1)), sg.InputText(key='ID', font="Arial 20", background_color="#F7F9F9", size=(10,1)),sg.Button("Enter",font="Arial 10", pad=(10,0))],
          [sg.Text("Student Name:", font=("Arial", 15, 'bold'), pad=(20,30), size=(12,1)), sg.Multiline(key='name', font="Arial 20", pad=(0,5), background_color="#F7F9F9", size=(17,1), do_not_clear=False)]]

window = sg.Window("Working Code", layout)

while True:
    event,values = window.read()
    if event == "Cancel" or event == sg.WIN_CLOSED:
        break
    elif event == "Enter":        
        for row in sheet.rows:
            if  int(values['ID']) == row[2].value:
                print("Student Name:{} {}".format(row[0].value,row[1].value))        
                window['name'].update(f"{row[0].value} {row[1].value}")
                break
        else:
            sg.popup_error("Record not found", font="Arial 10")

window.close()