熊猫读取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值而不是公式的主要内容,如果未能解决你的问题,请参考以下文章