电子表格背后的数据结构是什么?


35

我想了解如何解决电子表格(一组命名或以其他方式标识的单元格,其中包含引用其他单元格的值或公式)。我曾尝试查看现有项目,但由于GUI,序列化,事件等操作太多,以至于找不到电子表格。

简单地说,它是如何工作的?


1
如果您想查看具有最小gui的电子表格实现(从而减少对问题实质的
itsbruce

Answers:


21

电子表格的核心是一种具有动态类型的功能语言,每个功能或值都可以引用为矩阵中的单元格。

而不是(defn some-name ...)some-name零件放置在单元格中。

如果您使用动态更新的功能语言(例如,clojure的lighttable),则会看到与电子表格大致相同的功能。将值绑定到名称,编写一个使用该值的函数,更改该值,该函数的输出立即更改。这=A1 + B2C3在excel 中的位置进行写操作一样。

因此,函数式程序员经常喜欢将电子表格编写为玩具程序……而且也是研究论文的主题。(是的,很抱歉,它们全都位于ACM.org付费墙后面)

  • 电子表格功能编程

    函数式编程社区已经对电子表格表现出了一定的兴趣,但是令人惊讶的是,似乎没有人考虑过使用Excel之类的标准电子表格与Haskell这样的标准函数式编程语言一起工作。在本文中,我们展示了一种可以做到这一点的方法。我们希望这样可以使电子表格程序员尝试功能编程。

  • Forms / 3:探索电子表格范式边界的一阶视觉语言

    尽管函数式编程的批评者有时声称对于大多数程序员来说,函数式编程太难了或违反直觉,但大多数人都无法理解和使用它们,但是通过查看电子表格的流行程度,可以找到相反的证据。电子表格范例是功能编程范例的一阶子集,在程序员和最终用户中都得到了广泛的认可。但是,大多数电子表格系统仍有许多限制。在本文中,我们讨论了语言特征,这些特征消除了这些限制中的几个限制,而不偏离一阶声明式评估模型。

  • 实施功能电子表格

    电子表格可以完成大量的最终用户开发。电子表格隐喻很吸引人,因为它是可视的并且可以进行交互式实验,但是正如Peyton Jones,Blackwell和Burnett所观察到的那样,电子表格隐喻甚至不接受最基本的抽象:将表达式转换为命名函数。因此,他们提出了一种使用具有指定输入和输出单元的工作表定义函数的方法。我们将其称为功能表。


WikipediaSpreadsheet的开头提供了一些有关如何实现的提示:

电子表格是一种交互式计算机应用程序,用于以表格形式组织和分析数据。电子表格是作为纸质会计工作表的计算机模拟而开发的。该程序对表示为数组单元的数据进行操作,并按行和列进行组织。数组的每个单元格都是一个模型-视图-控制器元素,可以包含数字或文本数据,也可以是基于其他单元格的内容自动计算和显示值的公式的结果。

基于Java库中表示的Model-View-Controller范例纲要在此基础上构建。作者继续提到applet(有点过时,写在'93 -'96中),并提到了他的网页,该网页转到http://csis.pace.edu/~bergin/Java/applets.htm(是,小程序)对应的电子表格代码http://csis.pace.edu/~bergin/Java/Spreadsheet.java

我要指出的是,在此applet 570行(包括文档)中,电子表格的整体并不大。

就是说,根据语言的不同,您可以只使用稀疏数组中的函数指针来完成所有操作。


32

从概念上讲,每个单元格都是有向无环图的节点,对其他单元格的引用会在该图中创建边。更改单元时,对更改后的单元可访问的所有节点的拓扑排序将为您提供评估单元所需的顺序。一旦确定了正确的顺序,它就是标准表达式解析。


3
好吧,叫我好些,但不能保证您不能在电子表格中创建任何循环。实际上,我只是用Excel测试了此内容,但得到了警告,但是通过忽略它,我可以轻松创建循环引用。
布朗

1
@DocBrown为了避免陷入循环并冻结程序,它可能会在最后一个链接(该链接可能导致该链接)上被剪切。
2013年

1
好点,@ DocBrown。即使您决定允许递归,您仍然必须检测该循环并将其像DAG一样对待,以计算顺序。您只需多次执行该命令。
Karl Bielefeldt

什么样的数据结构可以用来模拟这种DAG依赖关系?我正在检查邻接矩阵,但是使用**数组,我们无法将属性关联到节点和边。例如,单元格上的公式将是属性之一
Andy Dufresne


0

我已经编码了一个python包,该包允许您将MS Excel文件目标函数单元格结构转换为Python。XL2py

单元格值被解析为dict()类型的对象,并将其值附加到对象上。通过公式引用其他单元格的单元格包含节点。节点引用其值由其公式定义的单元格。根据每个节点公式,定义了一个依赖关系结构,以定义是否存在循环引用。通过考虑所涉及的单元依赖性结构来定义节点计算顺序。

从I / O树结构开始,您可以随意使用Python中的任何最小化算法实现。

我建议您看看https://github.com/gusmaogabriels/XL2py

最好的问候,加百利

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.