在 Gopher Meetup 北京站上,阿里巴巴高级开发工程师、前百度 Go 语言编程委员会成员续日进行了主题为《Go语言国际电子表格文档格式标准实践》的演讲。
Excelize 是 Go 语言编写的用于操作 Office Excel 文档类库,基于 ECMA-376, ISO/IEC 29500 国际电子表格文档格式标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的 XLSX 文档,可以应用于各类报表系统中,做为 2018 开源中国最有价值开源项目,目前已成为 Go 语言最受欢迎的 Excel 文档基础库。本次演讲将探究国际文档格式标准,解读使用 Go 语言从 0 到 1 打造 Excelize 背后的故事,分享 Go 语言在国际电子表格文档格式标准方面的实践。
以下为演讲内容整理。
00
前言
大家好!我叫续日。今天给大家带来 Go 语言在国际电子表格文档格式标准实践方面的分享。提起电子表格大家都比较熟悉,以 Excel 为代表的经典电子表格已经应用在各行各业当中,根据相关研究机构的估算数据,世界上 Office 办公文档的数量在 2007 年的时候已经达到了 400 亿规模,并且每年大约以数十亿的规模增长。
为什么要用 Excelize
Excel 文档作为一种数据承载的重要载体,在很多领域都有应用。作为开发者,一些情况下需要用编程的方式操作这些 Excel 文档,比如从已有电⼦表格⽂档中读取内容、创建新的电⼦表格⽂档、基于已有⽂档(模版)⽣成新的电⼦表格⽂档、向电⼦表格⽂档中插⼊图⽚、图表和表格等元素,有时还需要跨平台实现这些操作。Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,使用 Excelize 可以方便的实现上述需求。今天的分享包含两个部分,第一部分介绍国际电子表格文档格式标准的内容,第二部分向大家分享在使用 Go 语言实现标准过程当中的一些经验。
01
文档格式国际标准
如果要用编程的方式操作电子表格文档,首先需要了解其标准。ECMA-376, ISO/IEC 29500 做为国际文档格式标准是一种基于 XML 和 ZIP 技术的文档格式,对应大家所熟悉的 Office 文档文件。这个标准的名字比较长,里面涉及到三个国际的标准化组织。ECMA 是欧洲计算机厂商联盟,ISO 大家比较熟悉,国际标准化组织,IEC 是国际电工协会,这三个国际化组织联合制定了文档格式国际标准。
标准特点分为六个方面,下面解释一下比较有代表性的几个特点。互操作性, 文档格式标准独立于专有格式、功能和运行时环境,平台语言无关,使开发人员可以进行广泛选择。国际化体现在文档标准当中涉及到像语言的书写规范,有些文字是纵向的,或者是从右到左的书写系统,以及各个国家地区的历法、时间的处理。高保真迁移,文档的内容本身不需要开发者把所有的数据结构都实现出来,也能在呈现上表现一致。因为它的数据结构是非常庞大的,也提供了向后扩展的空间,业务扩展空间体现在向后兼容的设计,在文档当中可以嵌入多媒体的文件,比如 VBA 脚本、图片、音视频等。
TC45 是 ECMA 下属的技术委员会,主要负责对该标准的修订和维护。这个标准目前已经发展到第五版,一共有五部分。委员会的代表中有很多大家熟悉的公司,其中包括计算机厂商、互联网公司和传统行业代表,例如光学镜片公司、石油公司和图书馆等,可以发现图书馆在信息化的存储方面也有很多的需求。
右边两张图片是标准文档的下载页面截图,第一张图片是该标准第一部分在 ISO 上的页面,可以看到第一部分的内容有超过 5000 页的文档,数量还是比较多的。第二张图片是 ECMA 网站上该标准的截图,上面有对标准中 5 个部分的描述,我们可以访问网站下载标准文档进行查看。大家比较熟悉的像 Microsoft Office Excel、Apple Numbers、LibreOffice、Google Docs、Apache OpenOffice 等,都是遵循该标准的典型代表。
标准规范
下面介绍一下标准的内容,首先上层是标记语言部分,这部分由四类标记语言组成。
Word 文档对应的标记语言叫 WordprocessingML,电子表格则是 SpreadsheetML,PowerPoint 演示文稿对应的是 PresentationML。Excelize 主要实现的是 SpreadsheetML 这个部分,除此之外 Office 文档支持进行跨应用的嵌套,例如:Word 可以嵌套 Excel,Excel 可以嵌套 Word。通用标记是跨应用的文本标记语言,涉及到可视化图表、可扩展标记、源数据和目录引用等。
中间这一层叫做开放包装公约(Open Packaging Convention),简称 OPC,是组织这些文档格式的上层描述语言,其中定义了文档内部组件之间的关联关系、文档内部数据结构之间的依赖和文件数字签名等。
下面是底层的核心技术,我们可以创建一个 Excel 文件,修改成 zip 扩展名解压一下就知道它是个压缩包,标准委员会采用比较基础的核心技术来定义文档格式,这样做有很强的扩展性,也方便各个平台去实现。
XSD (XML Schema Definition)