【问题标题】:Pandas: Excel cells with equation gives '0' in pandas read_excel()熊猫:带有方程式的Excel单元格在熊猫read_excel()中给出“0”
【发布时间】:2020-03-19 11:22:40
【问题描述】:
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 并在不更改任何内容的情况下将其关闭,则保存所有更改。 如果我保存它并用熊猫再次读取它,它会给出正确的输出和总和值。 我似乎无法理解出了什么问题。我正在使用 Excel 2016。在 excel 中,方程式运行良好。

【问题讨论】:

  • 看来read_excel 方法只是解析与您的工作簿关联的 XML 文件 - 而 Excel 正在运行公式并相应地更新 XML 数据。
  • 奇怪的是,如果我在运行脚本后打开 excel 并保存并关闭它,然后用 pandas 再次读取 excel。它给出了正确的输出。具有总和值。
  • 在 XlsxWriter 常见问题解答中查看此问题和答案:Q. Why do my formulas show a zero result in some, non-Excel applications?

标签: python pandas xlsxwriter excel-2016


【解决方案1】:

在挖掘了一些 pandasxlrd 代码之后,这是我的结论 - 大师们可以随意加入:

Excel 背景简介:

现代版本的 Excel(.xlsx 文件)是 Excel 从中读写的一系列 XML 文件。

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

但是,如果不打开 Excel,则不会计算此公式

熊猫:

为了过度简化pd.read_excel() 函数使用 xlrd 库来解析 XML 文件并将值作为 DataFrame 返回。

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

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

可能的解决方案:

您可能的解决方案是将数据存储到 CSV 文件并让 Python (pandas) 处理您的计算和数据操作。 Pandas 非常乐意读写 CSV 文件。

或者,查看subprocess 以从您的 Python 脚本中打开/关闭 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)

【讨论】:

  • 谢谢。现在我明白了这个问题。知道如何解决吗?通过解决我的意思是不打开excel并保存它。有什么办法吗?
  • 问题是我有一个 Excel 格式(带公式)泰语是我想先写然后用熊猫读的原因。我很感激你的回答。我帮助我理解了这个问题。
  • 明白了。也许查看subprocess - 它允许您从 Python 脚本运行 shell 命令。也许您可以在 Python 脚本结束时使用它来打开/关闭 Excel。更新了答案以显示一个伪示例。
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2018-09-30
  • 2017-01-10
  • 1970-01-01
  • 2021-08-11
  • 2017-05-03
  • 2018-03-16
相关资源
最近更新 更多