Python - openpyxl 在使用公式写入现有 xlsx 后读取 xlsx 数据
Python - openpyxl read xlsx data after writing on existing xlsx with formula
我正在使用 openpyxl.
在现有 xlsx excel 文件上写入后尝试读取 xlsx 文件
我的 Excel 文件 file1.xlsx
在 A1
上具有值 1
,在 A2
上具有值 2
,在 A1 + 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)
我的程序将在 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)
我正在使用 openpyxl.
在现有 xlsx excel 文件上写入后尝试读取 xlsx 文件我的 Excel 文件 file1.xlsx
在 A1
上具有值 1
,在 A2
上具有值 2
,在 A1 + 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)
我的程序将在 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)