Ich möchte verstehen, wie eine Tabelle (eine Gruppe benannter oder auf andere Weise identifizierter Zellen, die Werte oder Formeln enthalten, die auf andere Zellen verweisen) gelöst wird. Ich habe versucht, vorhandene Projekte zu betrachten, aber es war so viel los mit der GUI, der Serialisierung, Ereignissen usw., dass ich die Tabelle nicht finden konnte.
Am einfachsten wie funktioniert es?
design
algorithms
hildred
quelle
quelle
Antworten:
Im Kern ist eine Kalkulationstabelle eine funktionale Sprache mit dynamischer Typisierung, und jede Funktion oder jeder Wert kann als Zelle in der Matrix referenziert werden.
Anstelle von Dingen wie wird
(defn some-name ...)
dassome-name
Teil in einer Zelle selbst platziert.Wenn Sie zu einer dynamisch aktualisierten Funktionssprache wechseln (z. B. lighttable für clojure), sehen Sie einen Großteil derselben Funktionalität wie bei einer Tabellenkalkulation. Binden Sie einen Wert an einen Namen, schreiben Sie eine Funktion, die diesen Wert verwendet, ändern Sie den Wert und die Ausgabe der Funktion ändert sich sofort. Dies ist dasselbe, als würde man etwas
=A1 + B2
an der Stelle vonC3
in Excel schreiben .So schreiben funktionale Programmierer oft Tabellenkalkulationen als Spielzeugprogramme ... und auch das Thema von Forschungsarbeiten. (Ja, es tut mir leid, sie stehen alle hinter einer ACM.org-Paywall.)
Tabellenkalkulationsprogrammierung
Forms / 3: Eine visuelle Sprache erster Ordnung, um die Grenzen des Tabellenkalkulationsparadigmas zu erkunden
Implementieren von Funktionskalkulationen
Der Start von Spreadsheet bei Wikipedia gibt einige Hinweise zur Implementierung:
Aufbauend auf dem in den Java-Bibliotheken zum Ausdruck gebrachten Modell-View-Controller-Paradigma . Der Autor erwähnt weiterhin Applets (ein bisschen veraltet, sie wurden zwischen '93 und '96 geschrieben) und erwähnt seine Webseite, die zu http://csis.pace.edu/~bergin/Java/applets.htm (yes) führt , Applets) für den entsprechenden Tabellenkalkulationscode http://csis.pace.edu/~bergin/Java/Spreadsheet.java
Ich werde darauf hinweisen, dass die Gesamtheit der Tabelle in diesem Applet 570 Zeilen einschließlich Dokumentation nicht so groß ist.
Das heißt, je nach Sprache könnten Sie wahrscheinlich alles mit nur Funktionszeigern in einem spärlichen Array tun.
quelle
Konzeptionell ist jede Zelle ein Knoten eines gerichteten azyklischen Diagramms , und Verweise auf andere Zellen erzeugen Kanten in diesem Diagramm. Wenn Sie eine Zelle ändern, erhalten Sie durch eine topologische Sortierung aller Knoten, die von der geänderten Zelle aus erreichbar sind, die Reihenfolge, in der Sie die Zellen auswerten müssen. Sobald Sie die richtige Reihenfolge festgelegt haben, wird nur noch das Parsing von Standardausdrücken durchgeführt.
quelle
Wie bereits erwähnt, kann eine Tabelle leicht als DAG (Directed Acyclic Graph) implementiert werden, die in einem einfachen Hash oder Dictionary gespeichert ist. Ein einfacher Code zum Spielen ist wahrscheinlich der einfachste Weg, ihn zu verstehen:
Eine sehr einfache Python-Version: http://code.activestate.com/recipes/355045-spreadsheet/
Dies wurde in diesem Blog-Beitrag erklärt und ausgearbeitet: http://ralsina.me/weblog/posts/BB585.html
Es gibt auch eine einfache JavaScript-Version mit einer GUI hier: http://jsfiddle.net/ondras/hYfN3/
quelle
Ich habe ein Python-Paket programmiert, mit dem Sie die Zielfunktionszellenstruktur einer MS Excel-Datei in Python konvertieren können. XL2py
Zellwerte werden analysiert, und an ein Objekt vom Typ dict () werden ihre Werte angehängt. Zellen mit Verweisen auf andere Zellen durch Formeln umfassen Knoten. Knoten beziehen sich auf eine Zelle, deren Wert durch ihre Formel definiert wird. Aus jeder Knotenformel wird eine Abhängigkeitsstruktur definiert, um zu definieren, ob Zirkelverweise vorhanden sind oder nicht. Knotenberechnungsreihenfolgen werden unter Berücksichtigung der beteiligten Zellenabhängigkeitsstrukturen definiert.
Ab der E / A-Baumstruktur können Sie jeden Minimierungsalgorithmus verwenden, der in Python implementiert ist.
Ich würde vorschlagen, dass Sie einen Blick auf https://github.com/gusmaogabriels/XL2py werfen
Viele Grüße, Gabriel
quelle