No olvides que en las ciencias informáticas un problema casi siempere puede tener diversas resoluciones, por lo tanto aquí mostraremos la mejor y más eficiente.
Solución:
openpyxl admite la fórmula o el valor de la fórmula. Puede seleccionar cuál usando el data_only
bandera al abrir un libro de trabajo. Sin embargo, openpyxl no calcula ni calculará el resultado de una fórmula. Hay bibliotecas como pycel que pretenden hacer esto.
He resuelto el problema usando una combinación de openpyxl y 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 usan Excel como interfaz para usar Python.
Si desea utilizar una biblioteca de Python, puede probar PyCel, xlcalculator, Formulas y Schedula.
Soy el propietario del proyecto de xlcalculator.
xlcalculator usa openpyxl para leer archivos de Excel y agrega funcionalidad que traduce fórmulas de Excel a Python.
Un ejemplo usando xlcalculator con un archivo de 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 ejemplo usando xlcalculator con 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"))
Nos encantaría que puedieras dar recomendación a este enunciado si te fue útil.