Xxl 电子表格项目

作者:Vincent Granet

在我的学术工作期间,我必须定期向行政办公室提交学生成绩单。我管理的成绩数量不算庞大,每年大约两千个,但这足以保证借助电子表格程序自动化计算。我的日常计算机环境是 Linux,直到 1996 年,我一直遗憾缺少一个用于 X Window 系统的公共领域图形电子表格程序,一个用户友好且易于使用的程序。

当然,电子表格在 UNIX 世界中已经存在多年,但在我看来,它们都不符合我期望的免费、简单和用户友好的标准。我被迫在另一个办公室的另一台装有不同操作系统的计算机上使用商业电子表格。这种情况很不方便,所以我决定构建自己的电子表格。与此同时,计算机科学硕士课程中有一个计算机项目提案征集。这是一个启动项目的好机会,我提交了这个想法。它被一个由四名学生组成的团队选中,因此,Xxl 的历史开始了。

电子表格简史

电子表格的起源在于会计领域。这个名称指的是用于计算报价和需求之间成本差异的纸张,更普遍地说是指两个价格之间的成本差异。这些计算都是手工完成的,既繁琐又容易出错。计算机版本的首次理论研究出现在 20 世纪 60 年代初期。这些理论著作强调的使用矩阵、单元格和预算模拟的主要原则,在 FORTRAN 程序中得到了实现,用于模拟企业预算(参见资源)。

然而,直到 1978 年,两位麻省理工学院的学生 D. Bricklin 和 B. Frankston 设计了一个计算机电子表格 VisiCalc,它才真正可以在个人计算机上使用。VisiCalc 使许多小型企业能够使用以前只有大型公司才能负担得起的昂贵计算机技术。这个程序为个人计算机的成功做出了重大贡献,尤其是 Apple II,它的第一个版本就是为 Apple II 编写的。VisiCalc 取得了巨大的成功,但不幸的是,对于它的作者来说,这种成功非常短暂。在 20 世纪 80 年代初,VisiCalc 在试图应对 IBM PC 的崛起时遇到了困难。它被 M. Kapor 基于 VisiCalc 的新电子表格 Lotus 1-2-3 所取代。Lotus 1-2-3 的新功能,例如更简单的单元格表示法、单元格行或宏的概念以及图形处理的添加,使其迅速成为市场上的成功产品和事实标准。

在 80 年代后期,在 Macintosh 打开大门之后,大多数操作系统开始提供图形用户界面。电子表格 Quattro Pro 和 Excel 在那时出现,并且由于使用了下拉菜单、按钮和对话框,使得工作表处理更加简单。今天,Excel 是使用最广泛的商业电子表格之一。

多年来,UNIX 世界似乎对电子表格不感兴趣。最早可用的免费和开源电子表格是 scss(sc 的变体)。它们或多或少提供了电子表格所期望的所有基本功能,但没有图形界面。在 90 年代初期,基于 sc 的 Xspread 和 GNU 项目的 Oleo 是最早带有 X 界面的电子表格。两者都提供了新功能(Xspread 可以生成图形),但它们的图形界面仍然笨拙且缺乏用户友好性(它们都没有提供下拉菜单,也没有提供 X 风格的剪切和粘贴)。

今天,由于其内核和应用程序的质量,Linux 的成功如此之大,以至于这个系统开始超越一些商业操作系统巨头。Linux 开始进入工业界——这是目前办公套件(StarOffice、Koffice、Applixware、Gnome 项目的 Gnumeric)蓬勃发展的原因之一,这些套件旨在与它们的商业竞争对手匹敌。

Xxl 的设计宗旨是易于使用,并具有用户友好的界面。它并不试图与 Excel 或 Lotus 1-2-3 等电子表格竞争,但可以处理中小型工作表。

设计

通常,由于缺乏时间或能力,尼斯-索菲亚安提波利斯大学计算机科学硕士学位的编程项目要么没有完成,要么最终结果无法在实践中使用。期望获得可用的结果不应是首要任务,因为项目的目标主要是教学。对于这个特定的案例,我希望获得电子表格可用的初步版本,即使我预料到软件产品的某些部分需要修改,事实也确实如此。因此,项目的目标明确定义,电子表格被限制为任何经典电子表格的基本功能,并具有灵活且用户友好的界面。该项目分为两个不同的部分,尽可能少地连接。两名学生负责电子表格内核,另外两名学生负责图形界面。

由于电子表格的功能从一开始就受到限制,因此必须编写它以允许后续扩展;因此,编程语言的选择至关重要。我想要一种语言,它可以方便地编写电子表格原型,并启用增量开发方法。它还需要易于在测试周期和更正之间快速切换。此外,它应该集成一个易于使用的图形库,以使程序员摆脱 X 编程的所有繁琐方面。

我选择了 E. Gallesio 开发的 STk,它是编程语言 Scheme 和 Tk 图形工具包的实现(参见资源)。事实上,它类似于 Tcl/Tk 系统,只是 Tcl 解释器被 Scheme 解释器取代。更具体地说,STk 从 Scheme 世界中提供了 Tk 工具包的所有强大功能和易用性。此外,Lisp(Scheme 是 Lisp 的一种方言)已经证明了其在软件扩展方面的优势(例如,GNU Emacs)。最后,STk 提供了一个对象层 STklos,它为事后重用和扩展提供了便利。

Tk(以及 STk)在其发行版中没有提供任何专门用于表示电子表格程序的计算工作表的 widget,并且其预定义的组件也不容易构建这样的 widget。学生们每周只能抽出半天时间用于该项目。要求他们编写这样一个 widget 是不可能的——这个项目会立即失败。因此,有必要重用一些已构建的组件,以尽可能减少编程任务。

Linux 的优势之一是它为用户提供了一个开放的世界。世界各地成千上万的程序员正在设计和开发程序,这些程序通常质量上乘,他们免费提供给国际社会。其中一位程序员 J. Hobbs 是 Tk widget tkTable 的现任维护者。这个 widget 不仅专门用于表示计算工作表,而且它还具有一个属性,使其成为我的两个编程学生团队(即电子表格内核及其图形界面)之间理想的接口。tkTable widget 提供了将数据结构(表示单元格值)与图形计算工作表相关联的功能。在计算工作表的内容发生任何更改后,widget 会自动更新数据结构。此外,更重要的是,在数据结构发生任何更改后,widget 会更新计算工作表。由于这个属性,两个学生团队可以完全独立地工作。

我们重用的第二个组件是 LaTeX 环境,它在任何 UNIX 平台上都可用。Xxl 使用 LaTeX 打印计算工作表并在屏幕上预览它们。

1996 年 6 月,在项目结束时,学生们交付了第一个可用的版本,我们决定免费分发它。公开软件产品的源代码文本就是接受那些将仔细审查它的人的评判。我利用部分假期时间在第一次分发之前修改了代码,第一次分发发生在 9 月份。

第二年,令我失望的是,没有学生团队选择继续开发 Xxl。它目前的状态对我的自身需求来说是令人满意的,我没有时间投入到它的进一步开发中。然后,我收到了来自一个新的网站的邮件,该网站旨在推广 Linux 的科学应用 (SAL)。他们提出为 Xxl 提供一个页面。这个网站为电子表格带来了更广泛的受众,这鼓励了我改进它。再一次,我花了部分暑假时间修改 Xxl 代码,我用了一个假名签署了它。这一次,我几乎重写了所有代码,并且由于使用了 Flex 和 Bison 解析器生成器,代码得到了极大的简化。我还纠正了一些错误并提供了新功能。1997 年 9 月,交付了一个新版本。

1998 年 6 月初,E. Gallesio 交付了一个新版本的 STk,其中有一个小错误,导致电子表格无法正常工作。由于我没有使用这个版本,所以我没有遇到问题,但我收到了许多消息,要求我更正它,用户们认为错误来自 Xxl。我没有意识到 Xxl 有这么多用户。我花了 7 月份的一部分时间来分发一个工作版本。

虽然很明显,在像 Linux 这样的开放环境中,重用已构建的软件组件是一件好事,应该鼓励这样做,但这确实会带来问题。特别是,使用他们没有完全掌握的外部组件(即使有源代码在手)的程序员非常依赖这些组件的演变。像 Flex、Bison 或 LaTeX 这样的软件工具多年来一直保持稳定,没有引起任何问题。tkTable widget 或 STk 的情况并非如此,STk 仍在开发中并且不断变化。

对于 tkTable 的每个新版本,都有必要使其适应 STk。这表示 widget 的源代码中大约有一百处更改。显然,Xxl 必须跟随 tkTable widget 的演变,因为这些改进对它有利。

STk 的演变也可能是问题的根源。幸运的是,这种语言的作者是一位朋友,他的办公室离我的办公室不远。这使得解决许多问题成为可能。虽然 Xxl 肯定从 STk 的改进中受益,但 STk 也从 Xxl 中受益。事实上,电子表格的庞大规模使其成为一个良好的测试程序,可以暴露出解释器中的一些错误。

Xxl 的特性

Xxl 具有经典图形电子表格程序的大部分特性。它可以处理包含存储在单元格中的信息的计算工作表。每个工作表都带有滚动条。工作表的数量不受限制,除非受到物理内存大小的限制。

计算工作表以行和列的形式结构化。行用数字表示,列用字母表示。单元格是行和列的交点,并且像在 Lotus 1-2-3 中一样,用列号和行号表示(例如,A1、AB23、ZZA2345)。单元格范围用第一个和最后一个单元格表示,中间用冒号分隔(例如,A1:A3、A1:C1、A1:B8)。请注意,最后一个示例表示一个矩形。用户可以交互式且无限制地增加工作表的行数和列数。每个工作表的顶部都有一个输入区域,用于输入当前单元格的值。图 1 显示了一个 Xxl 电子表格的示例。

The Xxl Spreadsheet Project

图 1. Xxl 电子表格

存储在单元格中的信息由数据(字符串、数值或布尔值)或公式组成,公式可以计算数据。整数算术具有无限精度。公式是以等号开头的数学表达式。它们涉及算术和经典关系运算符,以及一组预定义函数。这些函数处理算术(sum、prod、max 等)、统计(avg)、逻辑(if、not、when)、时间(date、time)或字符串处理(concat、len)。请注意,所有可见的单元格值都会自动重新计算。

公式还可以包含对同一计算工作表中的单元格的内部或外部引用,有两种模式:绝对引用或相对引用。行名或列名前面的美元符号表示绝对引用(例如,$B2、D$13、$A$1)。绝对引用在移动操作(添加或删除行或列、剪切和粘贴操作)中不会更改。如果没有美元符号,则引用是相对引用(例如,B2、D13、A1)。它可以通过移动操作更改。图 1 的单元格 C3 包含公式 =A3-B3,它表示单元格 A3 和 B3 的值之间的差值。

前面的引用是内部引用,因为它们引用的是同一计算工作表中的单元格。相比之下,外部引用引用的是其他计算工作表中的单元格,并且必须以指定的计算工作表的文件名开头。

Xxl 提供了几种显示单元格的模式。首先,可以通过放大或缩小行或列来修改大小。其次,Xxl 提供了几种传统的显示单元格内容的方式:各种大小的多种字体、粗体和斜体;多种对齐模式(左对齐、右对齐、居中对齐)、多行文本;多种数字表示形式(固定、科学计数法、财务、百分比)或货币(法郎、美元、欧元)。

Xxl 的目标之一是通过图形界面提供简单的使用模型。电子表格的所有功能都可以通过控制面板访问,控制面板由带有按钮、菜单和消息区域的栏组成,所有这些都可以通过鼠标控制(参见图 2)。控制面板作用于当前工作表,可以通过“工作表”菜单或每个工作表左上角的按钮选择当前工作表。

The Xxl Spreadsheet Project

图 2. 控制面板

控制面板提供访问的主要功能如下

  • 选择当前工作表:当同时打开多个计算工作表时,控制面板的所有命令都应用于当前工作表。

  • 打开、关闭和保存计算工作表:存储格式是描述计算工作表的 STk 代码。因此,加载工作表只是解释描述它的程序。

  • 打印和预览计算工作表:这些功能使用 LaTeX。

  • 创建序列:此功能可以创建整数或文本值序列,并具有任何步长。

  • 剪切和粘贴行或列

  • 对行或列进行排序:可以通过增加或减少键值来完成。

  • 以多种格式编写计算工作表:LaTeX、文本、csv、HTML。

鼠标还用于两个重要功能:选择引用和剪切粘贴操作。在公式中输入单元格引用可以通过使用鼠标选择所需的单元格来自动完成。这对于引用行或外部引用尤其有用,在这些情况下,键盘输入容易出错。在计算工作表内或两个不同的工作表之间复制和粘贴单元格是根据两种模式完成的:是否要复制(或移动)带有或不带有公式的值。Xxl 还允许从计算工作表剪切和粘贴到另一个 X 应用程序,反之亦然。

最后,Xxl 提供带有对话框的在线帮助和控制面板按钮上的气球上下文帮助。然而,在线帮助有些匮乏,但如果电子表格的使用足够直观,则可以认为它足够了。

展望

我们刚刚考虑了 Xxl 的主要特性。人们可能会问,缺少哪些功能才能使其成为一流的电子表格。Xxl 的设计宗旨是简单,它将保持简单。例如,我不认为有必要能够处理几十种字体或页面布局。

在不久的将来要实现的新功能如下

  • 导出为其他格式以表示计算工作表(SYLK、WKS,...)并导入这些格式的文件。在我看来,确保与其他电子表格的兼容性非常重要。

  • 扩展公式的函数集。目前,电子表格仅提供三十个预定义函数。缺少搜索函数(hlookup、vlookup)以及财务计算。

  • 生成图形。直方图和饼图是帮助快速全面理解计算工作表的重要工具。

  • 国际化。一位俄罗斯用户指出,他无法对用母语编写的字符串进行排序。在最新版本的 STk 中,E. Gallesio 集成了一些使用本地化的字符串比较机制。因此,电子表格的国际化将很快完成。

  • 集成一种机制,允许用户添加自己的扩展。

长期开发将致力于提高计算工作表生成的可靠性。编写电子表格是一项容易出错的活动。R. Panko 的一项非常有趣的研究(参见资源)表明,即使由经验丰富的开发人员完成,各种规模的计算工作表的生成也存在显着的错误率。他还证明了构建计算工作表时经常缺乏验证方法,并且很少使用事后检查工具。令人惊讶的是,许多公司使用简单的电子表格来开发大型会计应用程序,而不是使用更可靠且更适合处理大量数据的软件产品。

计算工作表是一组通过引用链接的值,这些引用构成一种图。大多数电子表格的公式表示法基于引用其他单元格的单元格,为描述电子表格结构提供了非常低级的语义。变通地(在进行了必要的更改之后),这类似于 60 年代早期的编程语言,其中 goto 语句被用作构造代码的主要手段。这种与编程语言的类比并非偶然。构建计算工作表类似于构建程序。至少三十年来,编程领域一直在努力提供大量的工具和方法来构建结构化、可靠、可扩展等的程序。显然,此类工作尚未在电子表格领域完成,或者至少在大多数软件产品中没有产生明显的效应。

因此,Xxl 的目标是提供一种新的电子表格模型。特别是,它将导致开发一种独特的语言,该语言将允许它直接在电子表格中集成单元格类型机制、断言定义和全局描述。单元格类型将验证输入或剪切粘贴的值。断言机制将证明全局电子表格描述的有效性。

电子表格的文档编制是一个重要的方面;然而,电子表格开发人员通常认为它是多余的。实际上,Xxl 中几乎不存在文档编制工具。必须花时间提出一种机制来简化和自动化单元格和电子表格的文档编制。

编程是一项复杂的活动,需要知识和技术。电子表格是非常流行的软件产品,通常由非专业人士使用。对于他们中的大多数人来说,使用高级编程语言将是一个真正的困难。有必要为他们提供一个图形化的、交互式的界面,简单且用户友好,以便在不必使用编程语言的情况下描述电子表格的语义。

结论

Xxl 是尼斯-索菲亚安提波利斯大学学生开发的学术项目。它诞生于 1996 年,旨在满足 UNIX 世界对用户友好、易于使用和公共领域的图形电子表格程序的需求。UNIX 具有悠久的开源软件传统。在 80 年代初期,R. Stallman 和他的 FSF 铺平了道路。今天,它以 Linux 和互联网等不同的方式继续发展。在其开发过程中,Xxl 受益于各种免费软件产品。反过来,其作者也很乐意将其免费提供给国际社会。

最新版本的 Xxl 为中小型需求提供了一个真正实用的电子表格。它定义的模型类似于所有当前的电子表格。然而,这个模型是有限的,需要完全修改。Xxl 是一个稳定的实验平台,供未来的学生项目提出和定义新一代电子表格的工具。

资源

The Xxl Spreadsheet Project
Vincent Granet (vg@unice.fr) 于 1988 年在尼斯-索菲亚安提波利斯大学获得博士学位。在普罗旺斯大学和南锡第一大学任教后,他于 1995 年回到尼斯-索菲亚安提波利斯大学,担任计算机科学助理教授。他还是尼斯-索菲亚安提波利斯大学 I3S 实验室(计算机科学和信号处理)的研究人员,在那里他在“语言”团队工作。
加载 Disqus 评论