Pandas: ячейки Excel с уравнением дают '0' в pandas read_excel () - PullRequest
1 голос
/ 19 марта 2020
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 и закрою его, не изменяя ничего, что он говорит, сохраните все изменения. Если я сохраню его и прочту еще раз с pandas, это даст правильный вывод с суммой. Я не могу понять, что не так. Я использую Excel 2016. В Excel Уравнение работает отлично.

1 Ответ

3 голосов
/ 19 марта 2020

После просмотра кода pandas и xlrd я пришел к выводу, что гуру могут свободно прыгать:

Краткая справка по Excel:

Современные версии Excel (.xlsx файлов) - это серия XML файлов, из / в которые Excel читает и пишет.

Excel EXE отвечает за выполнение уравнений, таких как ваша SUM формула. Поэтому, когда вы открываете свою книгу, Excel вычисляет сумму и сохраняет значение в своих базовых XML файлах.

Однако, не открывая Excel, эта формула не рассчитывается .

Pandas:

Для упрощения , функция pd.read_excel() использует библиотеку xlrd для анализа файлов XML и возврата значений в виде DataFrame.

Однако без Excel для выполнения вычислений (ie: ваша функция SUM) это значение не сохраняется в базовом файле XML. Таким образом, вы возвращаете 0.

Вот некоторые дальнейшее чтение , любезно предоставлено комментарием @ jmcnamara.

Возможное разрешение:

Возможное разрешение для Вы можете сохранить свои данные в CSV-файле и позволить Python (pandas) позаботиться о ваших вычислениях и манипулировании данными. Pandas очень рад читать и писать файлы CSV.

В качестве альтернативы, посмотрите subprocess, чтобы открыть / закрыть Excel изнутри вашего Python скрипта.

псевдокод пример:

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)
...