【问题标题】:pandas read excel values not formulas熊猫读取excel值而不是公式
【发布时间】:2017-06-03 00:08:35
【问题描述】:

有没有办法让 pandas 只读取 excel 中的值而不是公式?除非我在运行代码之前进入并手动保存 excel 文件,否则它将公式读取为 NaN。我只是在使用 pandas 的基本读取 excel 功能,

import pandas as pd

df = pd.read_excel(filename, sheetname="Sheet1")

如果我在运行代码之前进入并保存了文件,这将读取值。但是在运行代码以更新新工作表之后,如果我在执行此操作后不进入并保存文件并尝试再次运行它,它会将公式读取为 NaN 而不仅仅是值。是否有一种解决方法,任何人都知道只会使用 pandas 从 excel 中读取值?

【问题讨论】:

  • 您的excel电子表格是否处于自动计算模式?
  • 是的,公式设置为自动计算。
  • 奇怪,您的原始文件是由人保存还是来自您转售之前的程序?
  • 由一个人保存,我们提取数据,然后根据该数据创建公式。但是我们拉入的数据只是复制并粘贴到一个文件中然后保存。
  • 我也遇到了类似的问题,但是它只发生在前几行,其余的它会获取公式处理的值。

标签: python excel pandas


【解决方案1】:

这很奇怪。 pandas 的正常行为是读取值,而不是公式。很可能,问题出在您的 excel 文件中。可能您的公式指向其他文件,或者它们返回 pandas 视为 nan 的值。

在第一种情况下,工作表需要更新,pandas 对此无能为力(但请继续阅读)。

在第二种情况下,您可以通过在 read_excel 中设置显式 nan 值来解决:

pd.read_excel(path, sheetname="Sheet1", na_values = [your na identifiers])

对于第一种情况,作为一种让您的工作更轻松的变通解决方案,您可以使用 xlwings 将您正在做的事情自动化:

import pandas as pd
import xlwings as xl

def df_from_excel(path):
    app = xl.App(visible=False)
    book = app.books.open(path)
    book.save()
    app.kill()
    return pd.read_excel(path)

df = df_from_excel(path to your file)

如果您想将这些公式保留在您的 Excel 文件中,只需将文件保存在不同的位置(book.save(不同位置))。然后就可以用shutil去掉临时文件了。

【讨论】:

  • 是的,我知道我可以自动保存,我只是想弄清楚是否有办法解决这个问题。这些公式不指向其他文件,它们只是从一列中获取值并减去其他列的值之和,因此它们只返回数字。
  • 写于 2020 年 9 月 - 即使公式指向其他文件,pd.read_excel() 现在也会读取值。
  • 写于 2021 年 1 月 - pd.read_excel() 仅在笔记本已“打开”时读取值,因此需要使用 xlwings 模拟打开和保存文件。据我所知,在打开工作簿之前不会计算公式,这就是为什么当工作簿仅由脚本更新时,带有公式的单元格没有与之关联的值
【解决方案2】:

我遇到了这个问题,我通过将图表移动到我正在阅读的第一行下方来解决它。看起来图表的位置可能会导致问题。

【讨论】:

    【解决方案3】:

    您可以使用 xlrd 来读取值。 首先,您应该刷新您的 excel 表,您还可以使用 python 自动更新值。你可以使用下面的功能 文件 = myxl.xls

    import xlrd
    import win32com.client
    import os
    
    def refresh_file(file):
        xlapp = win32com.client.DispatchEx("Excel.Application")
        path = os.path.abspath(file)
        wb =  xlapp.Wordbooks.Open(path)
        wb.RefreshAll()
        xlapp.CalculateUntilAsyncqueriesDone()
        wb.save()
        xlapp.Quit()
    

    文件刷新后,就可以开始阅读内容了。

    workbook = xlrd.open_workbook(file)
    worksheet = workbook.sheet_by_index(0)
    for rowid in range(worksheet.nrows):
        row = worksheet.row(rowid)
        for colid, cell in enumerate(row):
            print(cell.value)
    

    你可以循环遍历你需要的数据。并在读取数据时设置条件。更多的灵活性

    【讨论】:

    • 这段代码发生了什么?我根本无法使刷新功能起作用
    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 2020-08-27
    • 2020-12-15
    • 2018-10-06
    • 2015-04-15
    • 1970-01-01
    • 2014-08-21
    • 2020-12-16
    相关资源
    最近更新 更多