Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Evaluar fórmula con openpyxl
#1
Hola a todos y gracias de antemano por ayudarme con este problema.
Llevo poco tiempo en esto de la programacion y me ha surgido un problema al usar openpyxl.
Tengo una hoja de calculo en la cual  A1=25, B1=2 y D1=A1*B1, quiero que cuando cambio el valor de B1atraves de openpyxl tambien cambie el valor de D1, pero cuando abro el archivo excel veo que solo cambia el valor de B1 y la formula de D1 ha desaparecido.Os dejo  el codigo y el resultado.
 
Codigo.
  1. import openpyxl
  2. from openpyxl import Workbook
  3. a=0
  4. b=0
  5. d=0
  6. archivo=openpyxl.load_workbook("prueba.xlsx",data_only=True) #data_only se usa para que cargue los valores de la hoja y no las formulas
  7. tramo=archivo.get_sheet_by_name("h")
  8. a=tramo.cell(row=1,column=1).value
  9. b=tramo.cell(row=1,column=2).value
  10. d=tramo.cell(row=1,column=4).value
  11. print (a,b,d)
  12. tramo.cell(row=1, column=2).value=5
  13. archivo.save(filename="prueba.xlsx")
  14. tramo=archivo.get_sheet_by_name("h")
  15. a=tramo.cell(row=1,column=1).value
  16. b=tramo.cell(row=1,column=2).value
  17. d=tramo.cell(row=1,column=4).value
  18. print (a,b,d)
 

Resultado
 
C:\Users\Pc Lugones\Desktop\blunac\blunac2\prueba excel\excel.py:7: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  tramo=archivo.get_sheet_by_name("h")
25 2 50
C:\Users\Pc Lugones\Desktop\blunac\blunac2\prueba excel\excel.py:14: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  tramo=archivo.get_sheet_by_name("h")
25 5 50
[Finished in 2.3s]
Responder
#2
Hola, bienvenido.

¿No deberías usar data_only=False (o simplemente no indicar ese argumento) para que también cargue la fórmula de D1?

Saludos
Responder
#3
Gracias.
Esta es una prueba que hago para aplicarla en otro programa, si elimino data_only=False,  cuando cargo el valor de la celda desde otra parte del programa me devuelve "A1*B1" en vez del valor numerico.

tramo=archivo.get_sheet_by_name("h")
25 2 =A1*B1
C:\Users\Pc Lugones\Desktop\blunac\blunac2\prueba excel\excel.py:14: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  tramo=archivo.get_sheet_by_name("h")
25 5 =A1*B1
[Finished in 2.4s]

No olviidar que la formula desaparece de la hoja de calculo
Responder
#4
El problema es que openxyl es una librería para leer archivos de Excel, no es capaz de ejecutar las fórmulas inscriptas en el archivo. En ese caso deberías utilizar alguna otra herramienta o bien programar esa lógica vos mismo. También podrías abrir primero el archivo con el data_only=True, guardar el valor de la celda en una variable, luego reabrirlo con data_only=False, hacer los cambios correspondientes y guardar el archivo.

Saludos
Responder
#5
Sigo sin poder resolverlo.
Efectivamente si hago los cambios sin usar (data_only=True) no borra las formulas de la hoja, pero cuando los cargo usando (data_only=True) en vez del resultado de "A*B" me dvuelve "None" aunque en la hoja si esta el resultado. He observado que si despues de todo esto abro la hoja y la vuelvo a salvar desde excel y vuelvo cargar la hoja usando  (data_only=True) si me devuelve el resultado de "A*B·. De todo esto deduzco que el problema se genera cuando guardo los cambios de la hoja desde python (archivo.save(filename="prueba.xlsx")).
No se si hay otra manera de hacerlo, pero estoy desesperado.
Gracias por vuestras respuestas.
Responder
#6
Hola. La opción data_only=True no te garantiza que en una celda encuentres el resultado de la fórmula que contiene. Eso solo ocurrirá si Excel (o el software que haya generado el archivo) guardó como caché el último dato evaluado en la celda. Es responsabilidad del software que lee el archivo evaluar las fórmulas, pues justamente por eso son fórmulas en lugar de valores estáticos.

Saludos
Responder
#7
Gracias por tu respuesta Francisco.
Me estas diciendo  que para que para que los cambios que hago con openpyxl surtan efecto tendria que abrir y guardar  el archivo con excel en todas las ocasioenes?
Es posible que no haya una manera de hacerlo sin tener que abrir y guardar el archivo?
Responder
#8
Exacto. El meollo de la cuestión es que algún software tiene que evaluar la fórmula. openpyxl no puede evaluar las fórmulas, solo lee los datos del archivo. Si necesitás evaluar la fórmula desde tu código de Python, tratándose de una simple multiplicación podrías implementar la lógica vos mismo. Si la fórmula es más compleja, tenés la opción de "pedirle" a Excel que evalúe la fórmula usando una librería como xlwings, aunque este método requiere que Excel esté instalado, es menos portable y más lento.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)