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

时间:2015-10-08 06:52:57

标签: python xlsx openpyxl read-write

我尝试使用 openpyxl 在现有的xlsx excel文件上书写后读取xlsx文件。

我的Excel文件file1.xlsx1上的值为A1,在2上的值为A2,在A1 + A2上的值为A3 ,此时为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)

我的计划将更新A1上的file1.xlsx并阅读A3上的数据。例如,调用updateFile(5)会将A1更新为5,并可能会在7上提供A3

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

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

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

3 个答案:

答案 0 :(得分:0)

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

文档中介绍了这一点:http://openpyxl.readthedocs.org/en/stable/usage.html#read-an-existing-workbook

答案 1 :(得分:0)

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

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)

答案 2 :(得分:0)

对于可能遇到此问题的任何人,如果您不介意从BitBucket源代码安装openpyxl,请在此处进行(beta!)修复: https://bitbucket.org/cliffckerr/openpyxl/src/default/