Pandas:Excel 带有等式的单元格在 pandas read_excel() 中给出“0”

Pandas: Excel cells with equation gives '0' in pandas read_excel()

import xlsxwriter
import pandas as pd

workbook = xlsxwriter.Workbook('Expenses01.xlsx')
worksheet = workbook.add_worksheet()

expenses = (
    ['Rent', 1000],
    ['Gas',   100],
    ['Food',  300],
    ['Gym',    50],
)

row = 0
col = 0

for item, cost in (expenses):
    worksheet.write(row, col,     item)
    worksheet.write(row, col + 1, cost)
    row += 1


worksheet.write(row, 0, 'Total')
worksheet.write(row, 1, '=SUM(B1:B4)')

workbook.close()

df = pd.read_excel('Expenses01.xlsx')
r_list = df.values.tolist()

for r in r_list:
    print(r)

如果我手动打开 excel 并在不更改任何内容的情况下关闭它,它会提示保存所有更改。 如果我保存它并使用 pandas 再次读取它,它会给出带有总和值的正确输出。 我似乎不明白哪里出了问题。我正在使用 Excel 2016.In excel 等式工作正常。

在深入研究了一些 pandasxlrd 代码之后,这是我的结论 - 专家们可以随时加入:

简要Excel背景:

Excel 的现代版本(.xlsx 文件)是一系列 XML 文件 from/to,Excel 可读写。

Excel EXE 负责运行宁方程,例如您的SUM 公式。因此,当您打开工作簿时,Excel 正在计算总和并将值存储到其基础 XML 文件中。

但是,不打开Excel,这个公式没有被计算

Pandas:

为了过度简化pd.read_excel() 函数正在使用 xlrd 库来解析 XML 文件和 return值为 DataFrame

但是,如果没有 Excel 到 运行 计算(即:您的 SUM 函数),该值不会存储到基础 XML文件。所以你得到 0 returned.

这是一些 further reading,感谢@jmcnamara 的评论。

可能的解决方案:

一个可能的解决方案是将数据存储到 CSV 文件中,让 Python (pandas) 负责您的计算和数据操作。 Pandas读写CSV文件很开心

或者,从您的 Python 脚本中查看 subprocess 到 open/close Excel。

伪代码示例:

import subprocess
# Open Excel and workbook.
subprocess.Popen('start excel.exe /path/to/myExcel.xlsx', shell=True)
# Kill all open Excel instances.  (Use with care!)
subprocess.Popen('taskkill /f /im excel.exe', shell=True)