如何解决Python Tkinter调用openpyxl写表格时按钮点击覆盖首行问题
问题描述
我正在尝试向电子表格文件(实际使用的是LibreOffice Calc而非Excel)写入数据,用于保存历史数据,后续生成季度会议状态更新图表,只要数据格式正确即可正常生成图表,该部分无问题。
但我遇到的问题是:点击Tkinter窗口的按钮时,待写入信息虽能成功存入文件,但每次点击都会覆盖第一行数据,无法自动追加到新行。以下是简化后的示例代码,我不知道需要在函数中补充什么逻辑才能实现换行追加不覆盖,求解决方案:
from tkinter import * from openpyxl import Workbook def excel (): wb=Workbook() ws=wb.active cellx='A1' ws[cellx]=E1.get() wb.save("sample.xlsx") #Assumeing I need something similar to ws.cell(row=cellx+1) but it doesn't work. root=Tk() L1=Label(root,text="Tester") E1=Entry(root,width=10) b1=Button(root,text="Save",command=excel) L1.pack() E1.pack() b1.pack() root.mainloop()
补充说明:实际代码中会有多个输入框,部分输入内容为文本,部分仅为数字。
解决方案
原代码的核心问题是每次触发保存函数时都新建了空白工作簿,且固定写入A1单元格,自然会覆盖旧数据。按照以下逻辑修改即可实现追加写入:
- 保存前先判断目标文件是否存在,存在就加载已有文件,不存在再新建
- 读取已有表格的最大行数,将新数据写入最大行数的下一行
- 支持文本、数字自动写入,无需额外转换,兼容LibreOffice Calc读取
修改后完整代码:
import os from tkinter import * from openpyxl import Workbook, load_workbook def excel(): file_path = "sample.xlsx" # 检查文件是否已存在 if os.path.exists(file_path): # 加载已有工作簿 wb = load_workbook(file_path) ws = wb.active # 计算新数据要写入的行号:已有最大行数+1 next_write_row = ws.max_row + 1 else: # 文件不存在时新建工作簿 wb = Workbook() ws = wb.active # 首次写入从第一行开始 next_write_row = 1 # 写入A列数据(对应第一个输入框) ws.cell(row=next_write_row, column=1, value=E1.get()) # 多输入框可依次添加,比如第二个输入框写B列: # ws.cell(row=next_write_row, column=2, value=E2.get()) # 保存文件 wb.save(file_path) root=Tk() L1=Label(root,text="Tester") E1=Entry(root,width=10) b1=Button(root,text="Save",command=excel) L1.pack() E1.pack() b1.pack() root.mainloop()
内容的提问来源于stack exchange,提问作者Craig Walker
相关产品推荐
相关产品推荐

