大熊猫读取excel值而不是公式

时间:2017-01-18 14:46:05

标签: python excel pandas

有没有办法让pandas只读取excel的值,而不是公式?它以NaN形式读取公式,除非我进入并在运行代码之前手动保存excel文件。我正在使用pandas的基本读取excel函数,

import pandas as pd

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

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

3 个答案:

答案 0 :(得分:2)

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

在第一种情况下,需要更新工作表,并且熊猫无法做到这一点(但请继续阅读)。

在第二种情况下,您可以通过在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摆脱临时文件。

答案 1 :(得分:0)

我遇到了这个问题,并通过将图形移动到正在读取的第一行下方来解决此问题。看起来图的位置可能会引起问题。

答案 2 :(得分:0)

您可以使用 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)

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