Pandas:带有方程式的Excel单元在pandas中给出'0'read_excel()

问题描述 投票:1回答:1
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)

This Is the output of the program

如果我手动打开excel并关闭它而不进行任何更改,它会说保存所有更改。如果我保存它并用熊猫再次阅读,它会给出总和值正确的输出。我似乎无法理解什么地方出了问题。我正在使用Excel2016。在excel中,公式正常运行。

python pandas xlsxwriter excel-2016
1个回答
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)负责计算和数据处理。熊猫非常高兴读写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)
© www.soinside.com 2019 - 2024. All rights reserved.