Holen Sie sich Formel aus Excel-Zelle mit Python Xlrd

Ich muss einen Algorithmus von einem Excel-Blatt zu Python-Code portieren, aber ich muss den Algorithmus aus der Excel-file zurückentwickeln .

Das Excel-Blatt ist ziemlich kompliziert, es enthält viele Zellen, in denen es Formeln gibt, die sich auf andere Zellen beziehen (die auch eine Formel oder eine Konstante enthalten können).

Meine Idee ist, mit einem Python-Skript das Blatt zu parsing, das eine Art Tabelle von Abhängigkeiten zwischen Zellen erstellt, das heißt:

A1 hängt von der Formel B4, C5, E7 ab: "= sqrt (B4) + C5 * E7"
A2 hängt von der Formel B5, C6 ab: "= sin (B5) * C6"

Das xlrd– Python-module erlaubt es, eine XLS-Arbeitsmappe zu lesen, aber im Moment kann ich auf den Wert einer Zelle zugreifen, nicht auf die Formel .

Zum Beispiel kann ich mit dem folgenden Code einfach den Wert einer Zelle erhalten:

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) 

Wie auch immer, es scheint keine Möglichkeit zu haben, das Formular aus dem Cell-object zu erhalten, das von der .cell (…) -Methode zurückgegeben wird. In der Dokumentation heißt es, dass es möglich ist, eine String-Version der Formel zu erhalten (in Englisch, weil es keine Informationen über die Übersetzung von functionsnamen in der Excel-file gibt). Sie sprechen über Formeln (Ausdrücke) in den classn Name und Operand. Ich kann sowieso nicht verstehen, wie man die Instanzen dieser classn durch die Cell- classninstanz abruft, die sie enthalten muss.

Können Sie ein Code-Snippet vorschlagen, das den Formeltext aus einer Zelle abruft?

  • Ungültige Header liest xls file
  • Konvertiere xls / xlsx fileen (alle Blätter) nach csv mit VBScript (durch Semikolon getrennt)
  • Apache POI - CellStyle.ALIGN_RIGHT
  • Excel - Löscht alle Eins-zu-eins-Zeilen zwischen zwei Spalten
  • Versuchen, eine Teilmenge aus einem Excel zu übernehmen
  • Wie konvertiert man mehrere xls fileen mit Powershell zu csv?
  • Kann einen OLE DB Fehler nicht umgehen
  • Gibt es in Excel eine Koaleszenzfunktion?
  • 5 Solutions collect form web for “Holen Sie sich Formel aus Excel-Zelle mit Python Xlrd”

    [Dis] Claimant: Ich bin der Autor / Betreuer von xlrd .

    Die Dokumentationsverweise auf den Formeltext beziehen sich auf "Name" -Formeln; Lesen Sie den Abschnitt "Benannte referenceen, Konstanten, Formeln und Makros" am Anfang der Dokumentation. Diese Formeln sind blendenweit oder buchweit einem Namen zugeordnet. Sie sind nicht mit einzelnen Zellen verbunden. Beispiele: PI =Mktng!$A$2:$Z$99 auf =Mktng!$A$2:$Z$99 auf =Mktng!$A$2:$Z$99 . Die Namensformula decompiler wurde geschrieben, um die Überprüfung der einfacheren und / oder häufigeren Verwendungen definierter Namen zu unterstützen.

    Formeln im Allgemeinen bestehen aus mehreren Arten: Zelle, geteilt und Array (alle direkt oder indirekt mit einer Zelle verbunden), Name, dataüberprüfung und bedingte Formatierung.

    Das Dekompilieren allgemeiner Formeln von Bytecode zu Text ist langsam ein "in Arbeit befindliches". Beachten Sie, dass vorausgesetzt, es wäre verfügbar, Sie müssten dann die Textformula parsing, um die Zellbezüge zu extrahieren. Das korrekte Analysieren von Excel-Formeln ist keine einfache Aufgabe. Wie bei HTML sieht die Verwendung von Regex einfach aus, funktioniert aber nicht. Es wäre besser, die referenceen direkt aus dem Formel-Bytecode zu extrahieren.

    Beachten Sie auch, dass sich zellenbasierte Formeln auf Namen beziehen können und Namensformulan sowohl auf Zellen als auch auf andere Namen verweisen können. Es wäre also notwendig, sowohl Zellen- als auch Namenreferenzen sowohl aus zellenbasierten als auch aus Namensformulan zu extrahieren. Es kann nützlich sein, Informationen zu freigegebenen Formeln zur Verfügung zu haben. ansonsten Folgendes analysiert haben:

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

    Sie müssten die Ähnlichkeit zwischen den B3:B60 Formeln selbst ableiten.

    Auf jeden Fall wird wahrscheinlich keiner der oben genannten xlrd time verfügbar sein – xlrd Prioritäten liegen woanders.

    Update : Ich bin gegangen und habe eine kleine Bibliothek implementiert, um genau das zu tun, was Sie beschreiben: Die Zellen und Abhängigkeiten aus einer Excel-Tabelle extrahieren und in Python-Code konvertieren. Code ist auf Github , Patches willkommen 🙂


    Nur um hinzuzufügen, dass Sie immer mit Excel mit win32com interagieren können (nicht sehr schnell, aber es funktioniert). Dies ermöglicht Ihnen, die Formel zu erhalten. Ein Tutorial kann hier gefunden werden und Details können gefunden werden in diesem Kapitel [Kopie im Cache]

    Im Wesentlichen tun Sie nur:

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

    Was das Erstellen einer Tabelle mit Zellabhängigkeiten angeht, ist es eine schwierige Sache, die Excel-Ausdrücke zu parsing. Wenn ich mich richtig erinnere, macht der von Ihnen erwähnte Trace-Code das nicht immer richtig. Das Beste, was ich gesehen habe, ist der Algorithmus von EW Bachtal , von dem eine Python-Implementierung zur Verfügung steht, die gut funktioniert.

    Ich weiß, dass es sich um einen sehr alten Post handelt, aber ich fand eine anständige Methode, um die Formeln aus allen Blättern in einer Arbeitsmappe zu erhalten und die neu erstellte Arbeitsmappe alle Formatierungen beizubehalten.

    Der erste Schritt besteht darin, eine Kopie Ihrer .xlsx-file als .xls zu speichern. Verwenden Sie die .xls-file als filenamen im folgenden Code

    Verwenden von 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 

    Struktur des dictionarys 'sheet_formulas'

     {'Worksheet_Name': {'A1_cell_reference':'cell_formula'}} 

    Beispielergebnisse:

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

    Es scheint, dass es jetzt unmöglich ist, mit xlrd zu machen, was Sie wollen. In diesem Beitrag finden Sie eine detaillierte Beschreibung, warum es so schwierig ist, die benötigte functionalität zu implementieren.

    Beachten Sie, dass das Entwicklungsteam bei der python-excel google group gute Arbeit leistet.

    Ich weiß, dass dieser Beitrag etwas spät ist, aber es gibt einen Vorschlag, der hier nicht behandelt wurde. Schneiden Sie alle Einträge aus dem Arbeitsblatt aus und fügen Sie sie mit Hilfe von paste special (OpenOffice) ein. Dadurch werden die Formeln in Zahlen umgewandelt, so dass keine zusätzliche Programmierung erforderlich ist. Dies ist eine sinnvolle Lösung für kleine Arbeitsmappen.

    Spreadsheet (Microsoft Excel) makes working easy.