【问题标题】:Python - openpyxl read xlsx data after writing on existing xlsx with formulaPython - openpyxl 在使用公式写入现有 xlsx 后读取 xlsx 数据
【发布时间】:2019-01-30 15:54:04
【问题描述】:

在使用 openpyxl 写入现有 xlsx excel 文件后,我正在尝试读取 xlsx 文件。

我的 Excel 文件 file1.xlsxA1 上具有值 1A2 上的值 2A3 上的值 A1 + A2,此时为 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 上滥用读/写来解决这个问题?我相信我没有正确保存文件,或者我必须想办法以编程方式打开、保存、关闭 Excel 文件。

【问题讨论】:

    标签: python xlsx openpyxl read-write


    【解决方案1】:

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

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

    【讨论】:

    • 您好 Charlie,为了您的信息,我在参考所提供的文档时尝试使用 data_only=True。但是,在调用 updateFile(5) 之后,当使用 wb = load_workbook('file1.xlsx',data_only=True) 调用 readFile() 时,A3 变为“无”。正如帖子中所说,这只能在我实际打开 Excel 文件并在关闭时保存它之后才能修复。
    • 这是预期行为:现有缓存被 openpyxl 无效。在编辑文件之前,结果可能会缓存为7。一旦将其保存在 openpyxl 中,就没有缓存,因此在 data_only 模式下打开将返回 None 进行每次计算。为避免这种情况,您必须在data_only 模式下进行编辑,但这会丢失公式。否则,通过 OpenOffice Calc 之类的无头版本通过管道传输文件以重新计算缓存。
    • 所以我认为在使用“updateFile(5)”写入数据后,我无法读取“A3”上的更新单元格。因为在“data_only”模式下编辑会导致“A3”丢失公式,并且“A3”中的数据也可能不会更新。
    • 如果要编辑包含公式的工作表并保留公式,则这些公式的结果将不可用。想象一下,您有一个带有公式=A1+A2 的单元格,无法知道先前缓存的值是否仍然正确。因此,它必须无效并重新计算。由于 openpyxl 不计算公式,因此您需要使用另一个应用程序来执行此操作。
    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2021-12-19
      • 2021-09-11
      相关资源
      最近更新 更多