我尝试使用 openpyxl 在现有的xlsx excel文件上书写后读取xlsx文件。
我的Excel文件file1.xlsx
在1
上的值为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文件。
答案 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/