parser open library from example data best python excel formula xls xlrd

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



xlrd python example (5)

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 de un libro de trabajo y de que el libro de trabajo recién creado conservara todo el formato.

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

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 = ''<YOUR-FILE-HERE>'' 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),"")'',

Debo portar un algoritmo de una hoja de Excel a un código de Python, pero tengo que realizar una ingeniería inversa del algoritmo desde el archivo de Excel .

La hoja de Excel es bastante complicada, contiene muchas celdas en las que hay fórmulas que hacen referencia a otras celdas (que también pueden contener una fórmula o una constante).

Mi idea es analizar con una secuencia de comandos python la hoja construyendo una especie de tabla de dependencias entre las celdas, es decir:

A1 depende de la fórmula B4, C5, E7: "= sqrt (B4) + C5 * E7"
A2 depende de la fórmula B5, C6: "= sin (B5) * C6"
...

El módulo xlrd python permite leer un libro de XLS pero en este momento puedo acceder al valor de una celda, no a la fórmula .

Por ejemplo, con el siguiente código puedo obtener simplemente el valor de una celda:

import xlrd #open the .xls file xlsname="test.xls" book = xlrd.open_workbook(xlsname) #build a dictionary of the names->sheets of the book sd={} for s in book.sheets(): sd[s.name]=s #obtain Sheet "Foglio 1" from sheet names dictionary sheet=sd["Foglio 1"] #print value of the cell J141 print sheet.cell(142,9)

De todos modos, parece que no hay forma de obtener la formul del objeto Cell devuelto por el método .cell (...) . En la documentation , dicen que es posible obtener una versión de cadena de la fórmula (en inglés porque no hay información sobre la traducción del nombre de la función almacenada en el archivo de Excel). Hablan de fórmulas (expresiones) en las clases de Nombre y Operando . De todos modos, no puedo entender cómo obtener las instancias de estas clases por la instancia de la clase Cell que debe contenerlas.

¿Podría sugerir un fragmento de código que obtenga el texto de fórmula de una celda?


Parece que ahora es imposible hacer lo que quieras con xlrd. Puede echar un vistazo a esta publicación para obtener una descripción detallada de por qué es tan difícil implementar la funcionalidad que necesita.

Tenga en cuenta que el equipo de desarrollo hace un gran trabajo de soporte en el grupo de python-excel google.


Sé que esta publicación es un poco tarde, pero hay una sugerencia que no se ha cubierto aquí. Corta todas las entradas de la hoja de trabajo y pégalas usando paste special (OpenOffice). Esto convertirá las fórmulas a números para que no haya necesidad de programación adicional y esta es una solución razonable para libros pequeños.


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

Las referencias de documentación al texto de fórmula son sobre fórmulas de "nombre"; lea la sección "Referencias, constantes, fórmulas y macros con nombre" cerca del inicio de los documentos. Estas fórmulas están asociadas a todo el contenido de la hoja o del libro a un nombre; no están asociados con células individuales. Ejemplos: PI maps to =22/7 =Mktng!$A$2:$Z$99 , SALES maps to =Mktng!$A$2:$Z$99 . El descompilador de fórmula de nombre se escribió para permitir la inspección de los usos más simples y / o comunes de los nombres definidos.

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

Descompilar las fórmulas generales de bytecode a texto es un "trabajo en progreso", lentamente. Tenga en cuenta que, suponiendo que estuviera disponible, debería analizar la fórmula de texto para extraer las referencias de celda. Analizar las fórmulas de Excel correctamente no es un trabajo fácil; como con HTML, usar expresiones regulares parece fácil pero no funciona. Sería mejor extraer las referencias directamente de la fórmula bytecode.

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

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

necesitaría deducir la similitud entre las fórmulas B3:B60 usted mismo.

En cualquier caso, ninguno de los anteriores es probable que esté disponible en el xlrd plazo; xlrd prioridades xlrd encuentran en otro lugar.


Actualización : he ido e implementado una pequeña biblioteca para hacer exactamente lo que describes: extraer las celdas y 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 puedes interactuar con Excel usando win32com (no muy rápido pero funciona). Esto te permite obtener la fórmula. Un tutorial se puede encontrar aquí y se pueden encontrar detalles en este capítulo [copia en caché] .

Esencialmente solo haces:

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

En cuanto a la construcción de una tabla de dependencias celulares, algo complicado es analizar las expresiones de Excel. Si mal no recuerdo, el código Trace 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.