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

如何用Python(tkinter+openpyxl)实现发票号查询Excel行并在GUI展示?

解决Excel发票号检索并显示的GUI问题

我帮你修正了代码,实现了输入发票号后检索Excel并在文本框显示对应行的功能,先看完整的工作代码:

from tkinter import *
import openpyxl

def find_invoice():
    # 获取输入的发票号并去除首尾空格
    invoice_num = inv_field.get().strip()
    if not invoice_num:
        result_text.delete(1.0, END)
        result_text.insert(END, "请输入有效的发票号!")
        return
    
    # 读取Excel文件,注意用原始字符串避免转义问题
    path = r"E:\Library Management\issue.xlsx"
    try:
        wb = openpyxl.load_workbook(path)
        sheet = wb.active
        max_row = sheet.max_row
        max_col = sheet.max_column
        
        # 清空之前的结果
        result_text.delete(1.0, END)
        found = False
        
        # 遍历所有行(从第2行开始,假设第1行是表头)
        for row in range(2, max_row + 1):
            # 假设发票号在第1列,根据实际情况修改column的值
            cell_value = sheet.cell(row=row, column=1).value
            # 注意类型匹配,如果Excel里是数字,输入的是字符串需要转成int/float
            if str(cell_value).strip() == invoice_num:
                # 拼接该行所有列的内容
                row_content = []
                for col in range(1, max_col + 1):
                    cell_obj = sheet.cell(row=row, column=col)
                    row_content.append(str(cell_obj.value) if cell_obj.value else "")
                result_text.insert(END, "找到匹配行:\n" + "\t".join(row_content))
                found = True
                break
        
        if not found:
            result_text.insert(END, f"未找到发票号为 {invoice_num} 的记录!")
    except Exception as e:
        result_text.delete(1.0, END)
        result_text.insert(END, f"出错了:{str(e)}")

# 创建主窗口
a = Tk()
a.title('Return Book')
a.geometry('600x300')  # 扩大窗口容纳文本框

# 构建GUI元素
heading = Label(a, text='Return Book', font=('Arial', 12, 'bold'))
heading.grid(row=0, column=1, pady=10)

lab1 = Label(a, text='Enter Invoice Number:')
lab1.grid(row=1, column=0, padx=10, pady=5)

inv_field = Entry(a, width=30)
inv_field.grid(row=1, column=1, pady=5)

# 查找按钮,绑定到自定义的find_invoice函数
find_btn = Button(a, text='Find', width=8, command=find_invoice)
find_btn.grid(row=2, column=1, pady=10)

# 结果显示文本框
result_text = Text(a, height=6, width=70, wrap=WORD)
result_text.grid(row=3, column=0, columnspan=2, padx=10, pady=5)

a.mainloop()

关键修改点说明:

  • 解决函数名冲突:把原来的find函数改名为find_invoice,避免和按钮变量名重复,同时按钮的command正确绑定到这个函数(原来绑定的是关闭窗口的a.destroy,完全错误)。
  • 正确获取输入值:在函数内部通过inv_field.get().strip()获取用户输入的发票号,还添加了空输入的判断。
  • Excel遍历逻辑修正:遍历所有行(从第2行开始,假设第1行是表头),检查每行的发票号列(这里假设是第1列,你可以根据自己的Excel结构修改column=1的数值)。
  • 类型匹配处理:把Excel单元格的值转成字符串再和输入的发票号比较,避免因为数字/字符串类型不匹配导致找不到。
  • 添加结果显示文本框:新增Text组件用来显示检索结果,找到时展示整行内容,没找到时提示用户,出错时显示错误信息。
  • 路径转义处理:用原始字符串r"路径"避免反斜杠转义问题,防止读取文件失败。
  • 异常处理:包裹了Excel读取的代码,捕获可能的错误(比如文件不存在、路径错误),给用户友好提示。

你只需要根据自己的Excel文件调整发票号所在的列号,以及窗口大小等样式,就能正常使用啦!

内容的提问来源于stack exchange,提问作者The_Py_prog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:54:29