尝试在 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()
我正在尝试让 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()