熊猫读取excel值而不是公式

Posted

技术标签:

【中文标题】熊猫读取excel值而不是公式【英文标题】:pandas read excel values not formulas 【发布时间】: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电子表格是否处于自动计算模式? 是的,公式设置为自动计算。 奇怪,您的原始文件是由人保存还是来自您转售之前的程序? 由一个人保存,我们提取数据,然后根据该数据创建公式。但是我们拉入的数据只是复制并粘贴到一个文件中然后保存。 我也遇到了类似的问题,但是它只发生在前几行,其余的它会获取公式处理的值。 【参考方案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)

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

【讨论】:

这段代码发生了什么?我根本无法使刷新功能起作用

以上是关于熊猫读取excel值而不是公式的主要内容,如果未能解决你的问题,请参考以下文章

熊猫读取 excel 导致“不是 zip 文件”

具有格式化值而不是实际值的 EXCEL 公式

读取 Excel 单元格值而不是计算它的公式 -openpyxl

无法用熊猫读取 excel 文件

时间为 00:00 时,熊猫读取 excel 返回类型对象

熊猫。如何从 ZIP 存档中读取 Excel 文件