Openpyxl无法在修改后读取

2024-04-26 07:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

要求: 1.使用Tkinter创建gui 2.通过从Tkinter条目小部件获取值来更新excel 3.阅读同一工作手册的另一页 4.在Tkinter窗口内绘制图形。你知道吗

问题:所有的功能都正常工作,除了在同一时间修改和阅读一个又一个。你知道吗

在工作簿中加载数据\u only=False以保留公式。我已在“输入”中成功修改excel床单。然后呢当我从“模拟”表中读取单元格时,这些单元格链接到带有公式的“输入”表,没有数据。你知道吗

用excel打开并关闭excel文件,现在如果我再次运行python程序而不使用modify功能,程序就可以读取单元格值并绘制图形。你知道吗

在读取过程中,使用data_only=True第二次加载程序工作簿的功能,以获取单元格值。你知道吗

任何建议都会对我很有帮助。你知道吗

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()

Tags: textimportselfvaluecellcolumnexcelleft
1条回答
网友
1楼 · 发布于 2024-04-26 07:22:29

问题是openpyxl没有在excel中计算公式。它将只返回excel保存的最后一个值或“无”(仅返回数据\u=True)。后者是当您更改输入单元格并使用[cell].value用公式调用单元格的值时发生的情况。如果不更改工作表,则会在excel中设置值,这就是为什么禁用/不执行excel输入功能时代码会正常工作的原因。你知道吗

解决这个问题的最简单方法是使用xlwings,这应该是您想要的方式。还有一些其他的选择。例如直接使用WindowsExcel命令更新工作表,然后使用openpyxl读取,但我觉得交换模块是更简单的解决方案。您还可以考虑将函数带到进程的python端,并将结果写入excel工作表。你知道吗

how to get formula result in excel using xlwings

import xlwings as xw
sheet = xw.Book(r'C:/path/to/file.xlsx').sheets['sheetname']
result = sheet['X2'].value

相关问题 更多 >