Frage

Ich muss Port einen Algorithmus aus einer Excel-Tabelle zu Python-Code , aber ich muss Reverse Engineering den Algorithmus aus der Excel-Datei .

Das Excel-Blatt ist ziemlich kompliziert, es enthält viele Zellen, in denen es Formeln, die auf andere Zellen beziehen (das kann auch enthält eine Formel oder eine Konstante).

Meine Idee ist, mit einem Python-Skript, das Blatt des Aufbau eine Art Tisch von Abhängigkeiten zwischen den Zellen zu analysieren, das heißt:

A1 ist abhängig von B4, C5, E7 Formel: "= sqrt (B4) + C5 * E7"
A2 ist abhängig von B5, C6 Formel: "= sin (B5) * C6"
...

Das xlrd Python-Modul ermöglicht eine XLS-Arbeitsmappe zu lesen, aber im Moment kann ich den Zugang zu Wert eine Zelle, nicht die Formel .

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

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, die formul vom Cell-Objekt durch die zurück zu bekommen .cell (...) Methode. In Dokumentation sie sagen, dass es möglich ist, eine String-Version der Formel erhalten (in Englisch, weil es keine Informationen über die Funktionsname Übersetzung in der Excel-Datei gespeichert ist). Sie sprechen über Formeln (Ausdrücke) in der Name und Operand Klassen, trotzdem kann ich nicht verstehen, wie die Instanzen dieser Klassen erhalten, indem die Zelle Klasseninstanz das muss enthält sie.

Könnten Sie einen Code-Schnipsel, die die Formel Text aus einer Zelle wird?

War es hilfreich?

Lösung

[Dis] Verkünder. Ich bin der Autor / Betreuer der xlrd

Die Dokumentation Verweise auf Formeltext sind etwa „name“ Formeln; Lesen Sie den Abschnitt „Named Referenzen, Konstanten, Formeln und Makros“ in der Nähe von Anfang an der docs. Diese Formeln sind zugehöriges Blatt weit oder Buch weit auf einen Namen; sie sind nicht mit einzelnen Zellen in Verbindung gebracht. Beispiele: PI zu =22/7 abbildet, SALES Karten zu =Mktng!$A$2:$Z$99. Die Name-Formel Decompiler zur Unterstützung Inspektion der einfacheren und / oder häufig gefunden Verwendungen von definierten Namen geschrieben wurde.

Formeln sind im Allgemeinen von mehreren Arten: Zelle, geteilt, und das Array (alle mit einer Zelle assoziiert ist, direkt oder indirekt), Name, Datenüberprüfung und bedingte Formatierung

.

decompiling allgemeine Formeln von Bytecode Text ist eine "work-in-progress", langsam. Man beachte, dass die Annahme sie verfügbar wären, würden Sie dann den Text Formel analysieren müssen, um die Zellbezüge zu extrahieren. Parsing Excel-Formeln korrekt ist keine leichte Aufgabe; wie mit HTML, regulären Ausdrücke verwenden sieht einfach aus, aber funktioniert nicht. Es wäre besser, die Verweise direkt aus der Formel Bytecode zu extrahieren.

Beachten Sie auch, dass zellbasierte Formeln auf Namen beziehen, und die Namen Formeln sowohl auf Zellen und auf andere Namen verweisen. So wäre es notwendig, sowohl die Zelle und die Namen Referenzen von beiden zellbasierten und Namen Formeln zu extrahieren. Es kann nützlich sein, um Ihnen Informationen über freigegebene Formeln zur Verfügung zu haben; andernfalls die folgende analysiert haben:

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

Sie müßten die Ähnlichkeit zwischen den B3:B60 Formeln selbst abzuleiten.

Auf jedem Fall keines der oben genannten ist wahrscheinlich in absehbarer Zeit verfügbar sein -. xlrd Prioritäten woanders liegen

Andere Tipps

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


Just hinzuzufügen, dass man immer interact mit Excel win32com (nicht sehr schnell, aber es funktioniert). Dies ermöglicht es Ihnen, die Formel zu erhalten. Ein Tutorial können hier und Details finden Sie in diesem Kapitel [Cache gespeicherte Kopie] .

Im Wesentlichen Sie gerade tun:

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

Wie für eine Tabelle von Zelle Abhängigkeiten bauen, eine heikle Sache ist Parsen der Excel-Ausdrücke. Wenn ich mich richtig Trace Code erinnern Sie erwähnt nicht immer dies richtig tun. Das Beste, was ich gesehen habe, ist der Algorithmus von E. W. Bachtal , von denen eine Python-Implementierung zur Verfügung, die gut funktioniert.

Also ich weiß, ist dies eine sehr alte Post, aber ich fand eine anständige Art und Weise die Formeln aus allen Blättern in einer Arbeitsmappe zu bekommen sowie mit dem neu Arbeitsmappe all Formatierungen erstellt beibehalten.

Im ersten Schritt wird eine Kopie Ihrer .xlsx-Datei als .xls speichern - Verwenden Sie die .xls als Dateiname in dem folgenden Code

Mit 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 der Dictionary 'sheet_formulas'

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

Beispiel Ergebnisse:

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

Es scheint, dass es unmöglich ist, jetzt zu tun, was Sie mit xlrd wollen. Sie können einen Blick auf dieser Beitrag für die detaillierte Beschreibung, warum es so schwierig ist, die Funktionalität, die Sie implementieren müssen.

Beachten Sie, dass das developping Team hat eine große Aufgabe für die Unterstützung bei der Python-Excel-Google-Gruppe.

Ich weiß, dass diese Stelle ist ein wenig spät, aber es gibt einen Vorschlag, der hier behandelt worden ist. Schneiden Sie alle Einträge aus dem Arbeitsblatt und fügen Sie Paste spezielle Verwendung (Openoffice). Dadurch werden die Formeln Zahlen konvertieren, so dass keine Notwendigkeit für zusätzliche Programmierung gibt es, und das ist eine vernünftige Lösung für kleine Arbeitsmappen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top