Python - openpyxl 在使用公式写入现有 xlsx 后读取 xlsx 数据

Python - openpyxl read xlsx data after writing on existing xlsx with formula

我正在使用 openpyxl.

在现有 xlsx excel 文件上写入后尝试读取 xlsx 文件

我的 Excel 文件 file1.xlsxA1 上具有值 1,在 A2 上具有值 2,在 A1 + A2 上具有值 A1 + A2A3 上,此时是 3

def updateFile(a):
    wb = load_workbook('file1.xlsx')
    ws = wb.active
    #Update specific column
    ws['A1'] = a
    wb.save('file1.xlsx')

def readFile():
    wb = load_workbook('file1.xlsx')
    sheet = wb['Sheet1']
    print(sheet['A3'].value)

我的程序将在 file1.xlsx 上更新 A1 并在 A3 上读取数据。例如,调用 updateFile(5) 会将 A1 更新为 5,并可能在 A3 上给我 7

不幸的是,在调用 updateFile(5) 之后,readFile() 将给出 = A1 + A2 作为输出,而不是 7

这主要是因为Excel文件上的数据更新了但没有保存。而如果我想让readFile()输出7,我必须手动打开file1.xlsx,保存,然后关闭

无论如何还是我在 openpyxl 上滥用 read/write 来解决这个问题?我相信我没有正确保存文件,或者我必须想办法以编程方式打开、保存、关闭 Excel 文件。

您看到的是预期的行为。当单元格有公式时,Excel 会将公式的结果保存为缓存值。 openpyxl 从不评估公式,因此从不维护缓存并使任何现有缓存无效。相反,如果您想要公式的结果,则可以使用 data_only=True 参数加载文件。尽管这会将公式替换为值。

文档中对此进行了介绍:http://openpyxl.readthedocs.org/en/stable/usage.html#read-an-existing-workbook

我遇到了同样的问题。我的方法如下:

print('Reopen all files and save again')
for eachFile in glob.glob(path + fileCriteria)[:]:
    xl = DispatchEx('Excel.Application')
    xl.Visible = False
    wb = xl.Workbooks.Open(eachFile)
    wb.Close(True)