Saltar al contenido

Obtenga la fórmula de la celda de Excel con python xlrd

Esta inquietud se puede abordar de diversas formas, sin embargo te dejamos la que para nosotros es la solución más completa.

Solución:

[Dis]reclamante: soy el autor/mantenedor de xlrd.

Las referencias de la documentación al texto de la fórmula son sobre fórmulas de “nombre”; lea la sección “Referencias con nombre, constantes, fórmulas y macros” cerca del comienzo de los documentos. Estas fórmulas se asocian en toda la hoja o en todo el libro a un nombre; no están asociados con células individuales. Ejemplos: PI mapas a =22/7, SALES mapas a =Mktng!$A$2:$Z$99. El descompilador de fórmulas de nombre se escribió para respaldar la inspección de los usos más simples y/o comúnmente encontrados de nombres definidos.

Las fórmulas en general son de varios tipos: celular, compartida y array (todos asociados con una celda, directa o indirectamente), nombre, validación de datos y formato condicional.

Descompilar fórmulas generales de bytecode a texto es un “trabajo en progreso”, lentamente. Tenga en cuenta que, suponiendo que estuviera disponible, necesitaría analizar la fórmula de texto para extraer las referencias de celda. Analizar fórmulas de Excel correctamente no es un trabajo fácil; Al igual que con HTML, el uso de expresiones regulares parece fácil pero no funciona. Sería mejor extraer las referencias directamente del código de bytes de la fórmula.

Tenga en cuenta también que las fórmulas basadas en celdas pueden hacer referencia a nombres, y las fórmulas de nombres pueden hacer referencia tanto a celdas como a otros nombres. Por lo tanto, sería necesario extraer las referencias de celdas y nombres de las fórmulas basadas en celdas y de nombres. Puede serle útil tener información disponible sobre fórmulas compartidas; de lo contrario, habiendo analizado lo siguiente:

B2 =A2
B3 =A3+B2
B4 =A4+B3
B5 =A5+B4
...
B60 =A60+B59

tendrías que deducir la similitud entre los B3:B60 fórmulas usted mismo.

En cualquier caso, es probable que ninguno de los anteriores esté disponible en el corto plazo. xlrd las prioridades están en otra parte.

Actualizar: Fui e implementé una pequeña biblioteca para hacer exactamente lo que usted describe: extraer las celdas y las dependencias de una hoja de cálculo de Excel y convertirlas en código python. El código está en github, los parches son bienvenidos 🙂


Solo para agregar que siempre puede interactuar con Excel usando win32com (no muy rápido pero funciona). Esto le permite obtener la fórmula. A el tutorial se puede encontrar aquí [cached copy] y los detalles se pueden encontrar en este capítulo [cached copy].

Esencialmente solo haces:

app.ActiveWorkbook.ActiveSheet.Cells(r,c).Formula

En cuanto a la construcción de una tabla de dependencias de celdas, algo complicado es analizar las expresiones de Excel. Si no recuerdo mal, el código de rastreo que mencionaste no siempre hace esto correctamente. Lo mejor que he visto es el algoritmo de EW Bachtal, del cual está disponible una implementación de python que funciona bien.

Así que sé que esta es una publicación muy antigua, pero encontré una forma decente de obtener las fórmulas de todas las hojas en un libro de trabajo, además de hacer que el libro de trabajo recién creado conserve todo el formato.

El primer paso es guardar una copia de su archivo .xlsx como .xls: use .xls como nombre de archivo en el código a continuación

Usando Python 2.7

from lxml import etree
from StringIO import StringIO
import xlsxwriter
import subprocess
from xlrd import open_workbook
from xlutils.copy import copy
from xlsxwriter.utility import xl_cell_to_rowcol
import os



file_name = ''
dir_path = os.path.dirname(os.path.realpath(file_name))

subprocess.call(["unzip",str(file_name+"x"),"-d","file_xml"])


xml_sheet_names = dict()

with open_workbook(file_name,formatting_info=True) as rb:
    wb = copy(rb)
    workbook_names_list = rb.sheet_names()
    for i,name in enumerate(workbook_names_list):
        xml_sheet_names[name] = "sheet"+str(i+1)

sheet_formulas = dict()
for i, k in enumerate(workbook_names_list):
    xmlFile = os.path.join(dir_path,"file_xml/xl/worksheets/.xml".format(xml_sheet_names[k]))
    with open(xmlFile) as f:
        xml = f.read()

    tree = etree.parse(StringIO(xml))
    context = etree.iterparse(StringIO(xml))

    sheet_formulas[k] = dict()
    for _, elem in context:
        if elem.tag.split("}")[1]=='f':
            cell_key = elem.getparent().get(key="r")
            cell_formula = elem.text
            sheet_formulas[k][cell_key] = str("="+cell_formula)

sheet_formulas

Estructura del Diccionario ‘sheet_formulas’

'Worksheet_Name': 'A1_cell_reference':'cell_formula'

Resultados de ejemplo:

{u'CY16': {'A1': '=Data!B5',
  'B1': '=Data!B1',
  'B10': '=IFERROR(Data!B12,"")',
  'B11': '=IFERROR(SUM(B9:B10),"")',

Recuerda que puedes recomendar este ensayo si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *