Chciałbym zrozumieć, w jaki sposób rozwiązany jest arkusz kalkulacyjny (grupa nazwanych lub w inny sposób zidentyfikowanych komórek zawierających wartości lub formuły odnoszące się do innych komórek). Próbowałem przyjrzeć się istniejącym projektom, ale z GUI, serializacją, wydarzeniami itp. Działo się tyle rzeczy, że nie mogłem znaleźć arkusza kalkulacyjnego.
Najprościej jak to działa?
design
algorithms
Hildred
źródło
źródło
Odpowiedzi:
Zasadniczo arkusz kalkulacyjny jest językiem funkcjonalnym z dynamicznym pisaniem, a każdą funkcję lub wartość można określić jako komórkę w macierzy.
Zamiast rzeczy jak
(defn some-name ...)
wsome-name
części umieszcza się w samej komórce.Jeśli przejdziesz do dynamicznie aktualizowanego ideowego języka funkcjonalnego (takiego jak lighttable for clojure), zobaczysz wiele takich samych funkcji jak arkusz kalkulacyjny. Powiąż wartość z nazwą, napisz funkcję, która korzysta z tej wartości, zmień wartość, a wynik funkcji zmieni się natychmiast. To jest tak samo jak robienie czegoś takiego jak pisanie
=A1 + B2
w lokalizacjiC3
excel.W związku z tym programiści funkcjonalni często lubią pisać arkusze kalkulacyjne jako programy zabawkowe ... i także temat prac naukowych. (Tak, przepraszam, wszystkie stoją za paywallem ACM.org)
Programowanie funkcjonalne arkusza kalkulacyjnego
Forms / 3: Język wizualny pierwszego rzędu do eksploracji granic paradygmatu arkusza kalkulacyjnego
Wdrażanie arkuszy kalkulacyjnych funkcji
Początek arkusza kalkulacyjnego w Wikipedii zawiera kilka wskazówek, jak go wdrożyć:
Opierając się na tym z paradygmatu Zarys modelu Model-Widok-Kontroler wyrażonego w bibliotekach Java . Autor wspomina o apletach (nieco datowanych, napisano w latach 93–96) i wspomina o swojej stronie internetowej, która prowadzi pod adresem http://csis.pace.edu/~bergin/Java/applets.htm (tak , aplety) dla odpowiedniego kodu arkusza kalkulacyjnego http://csis.pace.edu/~bergin/Java/Spreadsheet.java
Zwrócę uwagę, że cały arkusz kalkulacyjny nie jest aż tak duży w tym aplecie 570 linii łącznie z dokumentacją.
To powiedziawszy, w zależności od języka, prawdopodobnie możesz to wszystko zrobić za pomocą wskaźników funkcji w rzadkiej tablicy.
źródło
Koncepcyjnie, każda komórka jest węzłem ukierunkowanego wykresu acyklicznego , a odniesienia do innych komórek tworzą krawędzie na tym wykresie. Po zmianie komórki topologiczne sortowanie wszystkich węzłów dostępnych z komórki, którą zmieniłeś, da ci kolejność potrzebną do oceny komórek. Po ustaleniu prawidłowej kolejności jest to po prostu standardowa analiza wyrażeń.
źródło
Jak już wspomniano, arkusz kalkulacyjny można łatwo zaimplementować jako DAG (ukierunkowany wykres acykliczny) przechowywany w prostym haszu lub słowniku. Prosty kod do zabawy jest prawdopodobnie najłatwiejszym sposobem na jego zrozumienie:
Bardzo prosta wersja Pythona: http://code.activestate.com/recipes/355045-spreadsheet/
Zostało to wyjaśnione i opracowane w tym poście na blogu: http://ralsina.me/weblog/posts/BB585.html
Dostępna jest również prosta wersja JavaScript z graficznym interfejsem użytkownika: http://jsfiddle.net/ondras/hYfN3/
źródło
Zakodowałem pakiet Pythona, który umożliwia konwersję struktury komórek funkcji celu pliku MS Excel do Pythona. XL2py
Wartości komórek są analizowane do obiektu typu dict () dołączającego ich wartości. Komórki z odniesieniami do innych komórek według wzorów zawierają węzły. Węzły odnoszą się do komórki, której wartość jest zdefiniowana przez jej formułę. Z każdej formuły węzła definiuje się strukturę zależności, aby określić, czy istnieją odwołania cykliczne. Kolejności obliczania węzłów są definiowane z uwzględnieniem struktur zależności zaangażowanych komórek.
W strukturze drzewa We / Wy możesz używać dowolnego algorytmu minimalizacji w Pythonie do woli.
Proponuję rzucić okiem na https://github.com/gusmaogabriels/XL2py
Pozdrawiam, Gabriel
źródło