Python Openpyxl在修改后无法读取
要求: 1.使用Tkinter创建gui 2.通过从Tkinter条目小部件获取值来更新excel 3.阅读同一工作簿的另一页 4.在Tkinter窗口内绘制图形 问题:除了同时修改和阅读一个接一个的功能外,所有功能都工作正常 加载带有数据的工作簿\u only=False以保留公式。我已经在“输入”表中成功修改了excel。然后,当我从“模拟”表中读取单元格时,这些单元格链接到带有公式的“输入”表,没有数据 用excel打开excel文件并将其关闭,现在如果我再次运行python程序而不使用修改功能,则该程序能够读取单元格值并绘制图形 在读取期间,使用data_only=True第二次加载程序工作簿的功能,以获取单元格值 任何建议都会对我很有帮助Python Openpyxl在修改后无法读取,python,excel,tkinter,openpyxl,Python,Excel,Tkinter,Openpyxl,要求: 1.使用Tkinter创建gui 2.通过从Tkinter条目小部件获取值来更新excel 3.阅读同一工作簿的另一页 4.在Tkinter窗口内绘制图形 问题:除了同时修改和阅读一个接一个的功能外,所有功能都工作正常 加载带有数据的工作簿\u only=False以保留公式。我已经在“输入”表中成功修改了excel。然后,当我从“模拟”表中读取单元格时,这些单元格链接到带有公式的“输入”表,没有数据 用excel打开excel文件并将其关闭,现在如果我再次运行python程序而不使用修
from tkinter import *
from tkinter import ttk
from openpyxl import load_workbook
import datetime
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
class Root(Tk):
f = Figure(figsize=(20,8))
a = f.add_subplot(111)
entryString1=0
entryString2=0
entryString3=0
entryString4=0
entryString5=0
entryString6=0
def __init__(self):
super(Root, self).__init__()
self.title("Python Tkinter Dialog Widget")
self.state("zoomed")
self.frame = ttk.Frame(self,borderwidth=2, relief="solid")
self.frame.pack(side='top',fill=X,padx=10,pady=20)
self.entry()
self.button()
self.canvas = FigureCanvasTkAgg(self.f, self.frame)
self.canvas.get_tk_widget().pack(fill="both",padx=10,pady=20)
self.canvas.draw()
def entry(self):
self.frame2 = ttk.Frame(self)
self.frame2.pack(fill=X,padx=10,pady=20)
self.labelentry1 = ttk.Label(self.frame2,text = "V Past Main begin period: ")
self.labelentry1.pack(fill=X,side='left',anchor=W)
self.entry1 = ttk.Entry(self.frame2)
self.entry1.pack(fill=X,side='left')
self.labelentry2 = ttk.Label(self.frame2,text = " V Past PS begin period: ")
self.labelentry2.pack(fill=X,side='left')
self.entry2 = ttk.Entry(self.frame2)
self.entry2.pack(fill=X,side='left')
self.labelentry3 = ttk.Label(self.frame2,text = " Adv 0% Main: ")
self.labelentry3.pack(fill=X,side='left')
self.entry3 = ttk.Entry(self.frame2)
self.entry3.pack(fill=X,side='left')
self.labelentry4 = ttk.Label(self.frame2,text = " Adv 0% PS: ")
self.labelentry4.pack(fill=X,side='left')
self.entry4 = ttk.Entry(self.frame2)
self.entry4.pack(fill=X,side='left')
self.labelentry5 = ttk.Label(self.frame2,text = " Single premium already paid: ")
self.labelentry5.pack(fill=X,side='left')
self.entry5 = ttk.Entry(self.frame2)
self.entry5.pack(fill=X,side='left')
self.labelentry6 = ttk.Label(self.frame2,text = " Yearly premium already paid: ")
self.labelentry6.pack(fill=X,side='left')
self.entry6 = ttk.Entry(self.frame2)
self.entry6.pack(fill=X,side='left')
def button(self):
self.frame3 = ttk.Frame(self)
self.frame3.pack(side='bottom')
self.labelFrame = ttk.LabelFrame(self.frame3,text = "Regenrate Graph")
self.labelFrame.pack(padx=10)
self.button = ttk.Button(self.labelFrame, text = "Click",command = self.fileDialog)
self.button.pack(padx=10)
def fileDialog(self):
self.entryString1 = self.entry1.get()
self.entryString2 = self.entry2.get()
self.entryString3 = self.entry3.get()
self.entryString4 = self.entry4.get()
self.entryString5 = self.entry5.get()
self.entryString6 = self.entry6.get()
#Load excel file
self.filename = "C:\\Users\\ramit\\Desktop\\Projection V0.3_Shankha .xlsx"
#load excel file to modify
self.work_book = load_workbook (self.filename)
self.sheet = self.work_book['Inputs']
if len(self.entryString1) != 0:
self.sheet.cell(row=4,column=5).value=int(self.entryString1)
if len(self.entryString2) != 0:
self.sheet.cell(row=5,column=5).value=int(self.entryString2)
if len(self.entryString3) != 0:
self.sheet.cell(row=6,column=5).value=int(self.entryString3)
if len(self.entryString4) != 0:
self.sheet.cell(row=7,column=5).value=int(self.entryString4)
if len(self.entryString5) != 0:
self.sheet.cell(row=9,column=5).value=int(self.entryString5)
if len(self.entryString6) != 0:
self.sheet.cell(row=10,column=5).value=int(self.entryString6)
self.work_book.save(self.filename)
self.work_book = None
#load excel file to read
self.work_book = load_workbook (self.filename,data_only=True)
self.sheet_1 = self.work_book['Simulation']
self.x = []
self.y = []
for i in range(10, 17):
self.x.append (self.sheet_1.cell(row=i + 1,column=1).value)
self.y.append (self.sheet_1.cell(row=i + 1,column= 77).value)
self.a.clear()
print(self.x)
print(self.y)
self.a.set_xlabel('Simulation date')
self.a.set_ylabel('Reserve')
self.a.plot(self.x, self.y, color='cyan', label='Projection')
self.canvas.draw()
root = Root()
root.mainloop()
问题是openpyxl没有在excel中计算公式。它将只返回excel保存的最后一个值或“无”(数据仅为True)。后者是更改输入单元格并使用[cell].value使用公式调用单元格值时发生的情况。当您不更改工作表时,您将在excel中获得设置的值,这就是为什么当您禁用/不执行excel输入功能时,代码会工作的原因 解决这个问题的最简单方法是使用xlwings,这应该是您想要的方式。还有一些其他的选择。例如,直接使用windows excel命令更新工作表,然后使用openpyxl阅读,但我觉得交换模块是更简单的解决方案。您还可以考虑将函数带到进程的Python端,并将结果写入Excel表。
您需要共享一些代码,以便我们能够看到问题所在并提供更好的帮助。第二次运行程序时,我对excel的编写部分进行了注释。那么阅读部分就可以了。但这两个部分不能同时出现。有人能说明否决投票的原因吗。也许我是python编程的新手,但任何人都可以在投票前很容易地指出我的错误。我不能投票,因为我没有那么多代表性。
import xlwings as xw
sheet = xw.Book(r'C:/path/to/file.xlsx').sheets['sheetname']
result = sheet['X2'].value