Openpyxl 正在保存损坏的文件,android

Openpyxl saving currupted file ,android

我制作了一个 tkinter 代码来将员工保存到 xlsx 文件,该程序在我的电脑上运行,但是当我 运行 它在我的 phone 中使用 pydroid3 时,代码 运行没有问题,但文件已损坏且无法使用。

有人有想法吗?我认为问题在于 wb.save('file.xlsx') 以损坏的形式保存文件。

代码:

from _tkinter import *
import tkinter as tk
from openpyxl import load_workbook
from datetime import datetime
wb = load_workbook('file.xlsx')
sheet = wb.active
ht = 500
wt = 500
root = tk.Tk()
var = tk.StringVar()
var.set(datetime.date(datetime.now()))
def call():
    n = 4
    j = d.get() + " 00:00:00"
    while True:
        a1 = sheet.cell(row=n, column=2)
        if j == str(a1.value):
            break
        n = n + 1
    p1 = sheet.cell(row=n, column=3)
    p1.value = e2.get()
    c1 = sheet.cell(row=n, column=4)
    c1.value = e6.get()
    m1 = sheet.cell(row=n, column=5)
    m1.value = e1.get()
    E1 = sheet.cell(row=n, column=7)
    E1.value = e4.get()
    D1 = sheet.cell(row=n, column=8)
    D1.value = e5.get()
    a1 = sheet.cell(row=n, column=9)
    a1.value = e3.get()
    t1 = sheet.cell(row=n, column=11)
    t1.value = e7.get()
    f1 = sheet.cell(row=n, column=6)
    f1.value = e8.get()

w = tk.Canvas(root, height= ht, width= wt)
w.pack()
frame= tk.Frame(root,bg='#3363F9')
frame.place(relwidth=1,relheight=1)
d = tk.Entry(frame,textvariable=var)
d.place(relx=0.6,rely=0.15)
# sc = tk.Label(frame,textvariable=var)
# sc.place(relx=0.4,rely=0.1)
s1 = tk.Label(frame,text="math")
s1.place(relx=0.15,rely=0.25)
e1 = tk.Entry(frame)
e1.place(relx=0.35,rely=0.25)
s2 = tk.Label(frame,text="physics")
s2.place(relx=0.15,rely=0.30)
e2 = tk.Entry(frame)
e2.place(relx=0.35,rely=0.30)
s3 = tk.Label(frame,text="arabic")
s3.place(relx=0.15,rely=0.35)
e3 = tk.Entry(frame)
e3.place(relx=0.35,rely=0.35)
s4 = tk.Label(frame,text="English")
s4.place(relx=0.15,rely=0.4)
e4 = tk.Entry(frame)
e4.place(relx=0.35,rely=0.4)
s5 = tk.Label(frame,text="German")
s5.place(relx=0.15,rely=0.45)
e5 = tk.Entry(frame)
e5.place(relx=0.35,rely=0.45)
s6 = tk.Label(frame,text="Chemistry")
s6.place(relx=0.15,rely=0.5)
e6 = tk.Entry(frame)
e6.place(relx=0.35,rely=0.5)
s7 = tk.Label(frame,text="transportion")
s7.place(relx=0.15,rely=0.55)
e7 = tk.Entry(frame)
e7.place(relx=0.35,rely=0.55)
s8 = tk.Label(frame,text="food")
s8.place(relx=0.15,rely=0.6)
e8 = tk.Entry(frame)
e8.place(relx=0.35,rely=0.6)
b = tk.Button(frame,text="get",command= lambda :call())
b.place(relx=0.75,rely=0.2)

root.mainloop()
wb.save('file.xlsx')

我已经稍微清理了您的代码并进行了测试。我这边没有腐败。如果有帮助,请告诉我。

1st 我们将所有标签名称存储在一个列表中。然后循环遍历该列表,我们使用索引和值来创建条目和标签小部件。我们使用索引来管理我们的网格。 place() 不适合小部件放置,因为如果您需要进行任何更改,您可能最终不得不重写任何一个地方以进行补偿。然后只需使用条目列表的正确索引更新单元格值。这里也不需要 canvas 。看来它只用于颜色。

示例:

import tkinter as tk
from datetime import datetime
from openpyxl import load_workbook


ht = 500
wt = 500
root = tk.Tk()
root.geometry('{}x{}'.format(ht, wt))
root.config(bg='#3363F9')
root.rowconfigure(0, weight=1)
root.rowconfigure(2, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(2, weight=1)
var = tk.StringVar()
var.set(datetime.date(datetime.now()))


def call():
    n = 4
    j = d.get() + " 00:00:00"
    wb = load_workbook('file.xlsx')
    sheet = wb.active

    while True:
        a1 = sheet.cell(row=n, column=2)
        if j == str(a1.value):
            break

        n = n + 1

    sheet.cell(row=n, column=3).value = entry_list[1].get()
    sheet.cell(row=n, column=4).value = entry_list[5].get()
    sheet.cell(row=n, column=5).value = entry_list[0].get()
    sheet.cell(row=n, column=6).value = entry_list[7].get()
    sheet.cell(row=n, column=7).value = entry_list[3].get()
    sheet.cell(row=n, column=8).value = entry_list[4].get()
    sheet.cell(row=n, column=9).value = entry_list[2].get()
    sheet.cell(row=n, column=11).value = entry_list[6].get()
    wb.save('file.xlsx')


frame = tk.Frame(root, bg='#3363F9')
frame.grid(row=1, column=1)

label_list = ["math", "physics", "arabic", "English", "German", "Chemistry", "transportation", "food"]
entry_list = []

for ndex, label in enumerate(label_list):
    tk.Label(frame, text=label, bg='#3363F9', fg='white').grid(row=ndex+2, column=0, sticky='e')
    entry_list.append(tk.Entry(frame))
    entry_list[-1].grid(row=ndex+2, column=1)

d = tk.Entry(frame, textvariable=var)
d.grid(row=0, column=2)
tk.Button(frame, text="get", command=call).grid(row=1, column=2)
root.mainloop()

也就是说,如果您愿意更改 excel 文件中的某些列,我们可以进一步减少它。如果您要按顺序将列与标签匹配,那么您可以这样做:

def call():
    n = 4
    j = d.get() + " 00:00:00"
    wb = load_workbook('file.xlsx')
    sheet = wb.active

    while True:
        a1 = sheet.cell(row=n, column=2)
        if j == str(a1.value):
            break

        n = n + 1

    for i in range(8):
        sheet.cell(row=n, column=i+3).value = entry_list[i].get()
    wb.save('file.xlsx')