Python >> Tutoriel Python >  >> Python

Openpyxl 1.8.5:Lecture du résultat d'une formule tapée dans une cellule à l'aide d'openpyxl

openpyxl prend en charge la formule ou la valeur de la formule. Vous pouvez sélectionner lequel en utilisant le data_only indicateur lors de l'ouverture d'un classeur. Cependant, openpyxl ne calcule pas et ne calculera pas le résultat d'une formule. Il existe des bibliothèques comme pycel qui prétendent faire cela.


J'ai résolu le problème en utilisant une combinaison d'openpyxl et de pandas :

import pandas as pd
import openpyxl
from openpyxl import Workbook , load_workbook


source_file = "Test.xlsx"
# write to file
wb = load_workbook (source_file)
ws = wb.active
ws.title = "hello world"
ws.append ([10,10])
wb.save(source_file)

# read from file
df = pd.read_excel(source_file)
sum_jan = df ["Jan"].sum() 
print (sum_jan)

xlwings, PyXll FlyingKoala, DataNitro utilisent tous Excel comme interface pour utiliser Python.

Si vous souhaitez utiliser une bibliothèque Python, vous pouvez essayer PyCel, xlcalculator, Formulas et Schedula.

Je suis le propriétaire du projet xlcalculator.

xlcalculator utilise openpyxl pour lire les fichiers Excel et ajoute une fonctionnalité qui traduit les formules Excel en Python.

Un exemple utilisant xlcalculator avec un fichier Excel :

from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator

filename = r'use_case_01.xlsm'
compiler = ModelCompiler()
new_model = compiler.read_and_parse_archive(filename)
evaluator = Evaluator(new_model)
val1 = evaluator.evaluate('First!A2')
print("value 'evaluated' for First!A2:", val1)

Un exemple utilisant xlcalculator avec un dict ;

input_dict = {
    "B4": 0.95,
    "B2": 1000,
    "B19": 0.001,
    "B20": 4,
    # B21
    "B22": 1,
    "B23": 2,
    "B24": 3,
    "B25": "=B2*B4",
    "B26": 5,
    "B27": 6,
    "B28": "=B19*B20*B22",
    "C22": "=SUM(B22:B28)",
  }

from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator

compiler = ModelCompiler()
my_model = compiler.read_and_parse_dict(input_dict)
evaluator = Evaluator(my_model)

for formula in my_model.formulae:
    print("Formula", formula, "evaluates to", evaluator.evaluate(formula))

# cells need a sheet and Sheet1 is default.
evaluator.set_cell_value("Sheet1!B22", 100)
print("Formula B28 now evaluates to", evaluator.evaluate("Sheet1!B28"))
print("Formula C22 now evaluates to", evaluator.evaluate("Sheet1!C22"))