SlideShare a Scribd company logo
1 of 28
Download to read offline
Go语⾔国际电⼦表格⽂档格式标准实践
International Spreadsheet Format Standard Implementation in Go Language
续日
Ri Xu
Beijing Gopher Meetup
2019.11.30
续 日
GitHub
§ github.com/xuri
Blog
2
⽬前就职于阿⾥巴巴,担任⾼级开发⼯程师,前百度 Go 语⾔编程委员会成员。开源软件
爱好者、W3C Member,专注于 Go 语⾔实践、中间件研发与⼤规模数据处理。
Currently working at Alibaba Group, as a software engineer, previous at Baidu Inc., as a
member of the Baidu Go language programming committee. Open-source software
enthusiasts and W3C open-source members. Focus on the Go language practice, middleware
development, and large-scale data processing.
§ xuri.me
3
github.com/xuri/excelize
在⼀些情况下我们需要通过编程⽅式操作电⼦
表格⽂档,例如:打开读取已有电⼦表格⽂档
内容、创建新的电⼦表格⽂档、基于已有⽂档
(模版)⽣成新的电⼦表格⽂档、向电⼦表格
⽂档中插⼊图⽚、图表和表格等元素,有时还
需要跨平台实现这些操作
为什么要用 Excelize
Why should you use the Excelize library
154 551
知名⽤户
Well-known Customers
文档格式国际标准
Standard for Document File Formats
标准特点
§ Apple
§ BP
§ Essilor
§ Intel
§ Microsoft
§ Statoil
§ The British Library
§ Toshiba
§ United States Library of Congress
§ …
4
TC (Technical Committee) 45 代表
§ 互操作性
§ 国际化
§ 对开发⼈员采⽤的障碍较低
§ ⾼保真迁移
§ 与业务数据集成
§ 创新空间
ECMA-376, ISO/IEC 29500
5
国际电子表格文档格式标准
International Spreadsheet Format Standard
遵循该格式标准的典型代表:
§ Microsoft Office Excel
§ Apple Numbers
§ LibreOffice
§ Google Docs
§ Apache OpenOffice
§ …
6
ECMA Office Open XML Specifications
字处理
WordprocessingML
电子表格
SpreadsheetML
演示文稿
PresentationML
扩展标记
CustomML
通用标记
Vocabularies
可视化
DrawingML
目录引用
Bibliography
元数据
Metadata
方程式
Equations
绘图 (早期版本)
VML (legacy)
依赖关系
Relationships
内容类型定义
Content Types
数字签名
Digital Signatures
标记语言
Markup Languages
开放包装公约
Open Packaging Convention
ZIP XML + Unicode
核心技术
Core Technologies
XSD (XML Schema Definition)
XSD 是 W3C 于2001年5⽉发布的标准,
⽤来描述 XML ⽂档的元素的定义。
7
§ 例如下面的一段 XML: § 其对应 XSD 的定义为:
XML Schema Dependency
8
格式解读
Format interpretation
电⼦表格⽂档内部⽬录结构
9
典型关系图
Typical Workbook Scenario
10
A typical workbook will not be a blank, minimum
workbook. A typical workbook might contain numbers,
text, charts, tables, and pivot tables. Each of these
additional parts is contained within the .zip package of
the spreadsheet document.
右图展示了⼀个包含了数字、⽂本、图表、表
格和数据透视表的典型电⼦表格⽂档 ZIP 包内
数据分布关系。
XML 结构与依赖关系处理
XML Schema and Relationship Processing
11
12
Excelize 是 Go 语⾔编写的⽤于操作 Office Excel ⽂档类库,基于 ECMA-376, ISO/IEC
29500 国际电⼦表格⽂档格式标准。可以使⽤它来读取、写⼊由 Microsoft Excel™
2007 及以上版本创建的 XLSX ⽂档,可以应⽤于各类报表系统和边缘计算系统中,作为
2018 开源中国最有价值开源项⽬,⽬前已成为 Go 语⾔最受欢迎的 Excel ⽂档基础库。
Excelize is a library written in pure Go and providing a set of functions that allow you to write to and read from
XLSX files. Support reads and writes XLSX file generated by Microsoft Excel™ 2007 and later. Support save file
without losing original charts of XLSX. This library needs Go version 1.10 or later.
Go 语言实现
Implementation in Go Language
13
单位转换
数据验证
表格 / 过滤器
基础能力
Crypto 加解密
数据处理能力
条件格式
数据透视表
图片 / 图表
2D / 3D 处理
簇状/堆积/面积图
柱形/锥形/饼图
气泡/散点/折线图
时间处理
属性设置能力
工作簿 / 工作表
可见性设置
属性设置
页眉页脚
搜索能力
页面布局
行/列处理
工作表属性
视图属性
数据保护
…
单元格
数据类型支持
选区合并
超链接
公式处理
单元格样式
字典
富文本
批注处理
样式索引
…
文件格式识别
样式处理能力
模型处理
模型组件化 模型校验 计算引擎 升级扩展能力 模型纠错验证
VBA 脚本
Excelize 技术架构图
Excelize Technical Architecture Diagram
OPC 封装与解构
媒体格式支持
依赖关系处理
元数据解析校验
扩展标记处理
边框样式 字体样式冻结窗格
行高 / 列宽 色值计算数字格式
14
设计原则:按需处理
Excelize 中的 File 结构体⽤来定义⽂档模型,
打开⽂档时初始化 XLSX,在外部 API 调⽤时,
按需加载所需处理的⽂档数据结构到对应的模
型上,再通过内部处理器进⾏处理。这种处理
⽅式在保证兼容性的同时,也提⾼了⽂档处理
的性能。
文档结构定义
Document Structure Definition
15
创建⽅法
使⽤ NewFile 新建 Excel ⼯作薄,新创建的⼯作簿中会默
认包含⼀个名为 Sheet1 的⼯作表。
在需要批量写⼊数据的场景下,Excelize 提供了两个坐标
处理⽅法:
func CellNameToCoordinates(cell string) (int, int, error)
func CoordinatesToCellName(col, row int) (string, error)
创建电子表格文档
Create Spreadsheet file by Excelize
16
调⽤⽅法
AddPicture 会根据给定的⼯作表名称、单元格坐标、图
⽚地址和图⽚格式(例如偏移、缩放和打印设置等),在
对应的单元格上插⼊图⽚。
GetPicture 则会根据给定的⼯作表名称(⼤⼩写敏感)和
单元格坐标获取⼯作簿上的图⽚,将以 []byte 类型返回嵌
⼊在 Excel ⽂档中的图⽚。
图片图表处理
Picture & Chart Processing in the Excelize
17
实现原理
在进⾏必要的参数校验和图⽚属性提取
后,在 Drawing 模块进⾏对图⽚属性的
处理,这⾥需要注意的是图⽚和图表都
在 drawings 中进⾏依赖和引⽤关系的
抽象定义。在完成对图⽚属性(坐标定
位、缩放⽐例、偏移量、打印属性、超
链接等)的处理后,还需要在全局内容
定义部分进⾏媒体属性信息的处理。
图片图表处理
Picture & Chart Processing in the Excelize
18
AddChart
Drawing
drawings/drawing%d.xml
Part Relationships
_rels/drawing%d.xml.rels
Related Part
charts/chart%d.xml
addRels (Rel.Type): “http://schemas.../drawings”
PartUri : “/drawing%d.xml”
contentTypesReader:“/drawing%d.xml”
Part: XML
addContentTypePart:
“application/vnd.openxmlformats-officedocument.drawing+xml”
prepareDrawing (drawingID):
“drawing%d.xml”
Excelize Drawing SubSystem
Content Type Stream
[Content_Types].xml
GetRels (Rel.Type):
“http://schemas.../charts”
PartUri : “/chart%d.xml”
Default extension
or URI override
图片图表处理
Picture & Chart Processing in the Excelize
19
数据透视表的创建
右图的源数据中包括年份、⽉份、商品类别、
销售额、区域 5 列数据,按商品分类对⽉销
售额进⾏汇总统计。
数据透视表
Pivot Table in the Excelize
20
实现原理
在进⾏必要的参数校验后,⾸先检查已存
在的数据透视表以确定创建模式,先根据
选区处理源数据,⽣成对应的数据透视缓
存,再根据数据透视缓存中的筛选 ID ⽣成
数据透视表,最后更新显示依赖关系和内
容类型定义表。
数据透视表
Pivot Table in the Excelize
21
处理方式
感应数据选区内受到关联的⽂档数据结构,
根据调节⽅向和偏移量对内存模型进⾏重
新计算。
例如:在对⼯作表中的数据进⾏删除操作
时,内存模型调节器会对该⾏以下的全部
相关数据进⾏纵向调节,如合并单元格、
公式、筛选器等。
内存模型调节器
Model Data Selection Adjuster in the Excelize
22
Go 语言处理多命名空间 XML 时的问题
The Issue About Handle Multi XML Namespace Prefixes in Go Language
使⽤如左图所示的结构体对 XML 先进⾏反序列化 (Unmarshal)
再进⾏序列化(Marshal),所得结果与原 XML 不⼀致。
相关 Issue:https://github.com/golang/go/issues/13400
23
Go 语言处理多命名空间 XML
Handle Multi XML Namespace Prefixes in Go Language
定义两套结构体分别进⾏反序列化和序列化操作。序列
化时,在结构体的 Tag 中,通过冒号连接命名空间和其
所属的属性或标签名,做为整体处理。
解决⽅案
24
Sparkline (迷你图) 的 XML ⽚段
电子表格文档中的多命名空间 XML
Multi XML Namespace Prefixes in Spreadsheet Documents
在电⼦表格⽂档处理过程中涉及到⼤量
包含多命名空间的 XML 处理场景。
25
Excelize 处理多命名空间 XML
Handle Multi XML Namespace Prefixes in the Excelize
解决⽅案
反序列化时:为保留原始命名空间信息,利⽤ innerxml Tag,
将 decodeWorksheetExt.Ext.Content 做为
decodeX14SparklineGroups 的 Wrapper
序列化时:先对 xlsxX14SparklineGroups 进⾏序列化,将序
列化结果做为 xlsxWorksheetExt.Content 的值,最后对
xlsxWorksheetExt 进⾏序列化。
26
性能表现
Performance
• 写⼊ 64 万个单元格的值耗时约 2.06 秒
• 创建 1000 张图表耗时约 10.06 秒
Rows Columns Time(s) Memory (MB)
Set Cell Value
200 50 0.03 4
400 50 0.07 5
800 50 0.12 9
1600 50 0.25 15
3200 50 0.49 53
6400 50 1.01 101
12800 50 2.06 137
Add Chart 200 50 10.6 171
* 数据基于基于普通个⼈计算机 (OS: macOS Mojave version 10.14.4, CPU: 3.4 GHz Intel Core i5,
RAM: 16 GB 2400 MHz DDR4, HDD: 1 TB, Go Version: go1.12.4 darwin/amd64, Commit: 0660f30)
• 相关开源类库性能对⽐
结语
Conclusion
国际电⼦表格⽂档格式标准
27
Go 语⾔实现
Excelize 发展规划
ECMA-376, ISO/IEC 29500
Excelize
支持图片、图表、数据透视表等复杂样式
• Formula calculation engine
• Remove rows and columns
• Conditional formatting support
• Encryption support
• Pivot Chart support
• Set multiline texts to cells support
• VBA Script support
• Complex chart style support
• Unit test assert equal with the result
• Object Linking and Embedding (OLE) format support
• Set Accounting number format currently
• Remove Data Validation support
• Diagrams (SmartArt Graphic)
• Streaming Read and Writing
续日
Ri Xu
GitHub
github.com/xuri
Email
xuri.me[at]gmail.com
Go语⾔国际电⼦表格⽂档格式标准实践
International Spreadsheet Format Standard Implementation in Go Language

More Related Content

Similar to Go 语言国际电子表格文档格式标准实践

Golangintro
GolangintroGolangintro
Golangintro理 傅
 
The Best Practice of Integrating Apache Flink with Apache Iceberg.pdf
The Best Practice of Integrating Apache Flink with Apache Iceberg.pdfThe Best Practice of Integrating Apache Flink with Apache Iceberg.pdf
The Best Practice of Integrating Apache Flink with Apache Iceberg.pdfZheng Hu
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdfssuserd6c7621
 
Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异cleverpig
 
Semantic web 本科课件
Semantic web 本科课件Semantic web 本科课件
Semantic web 本科课件Yueshen Xu
 
Lotus domino开发教程
Lotus domino开发教程Lotus domino开发教程
Lotus domino开发教程dyzm_2000
 
Subversion
SubversionSubversion
Subversioni7Xh
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式Gelis Wu
 
Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路Ri Xu
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成fangdeng
 
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言鍾誠 陳鍾誠
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source ProjectsGeorge Ang
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojectsGeorge Ang
 
网易相册前端页面开发规范2010版
网易相册前端页面开发规范2010版网易相册前端页面开发规范2010版
网易相册前端页面开发规范2010版昌里大金猪 Luke
 
從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docs從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docsimacat .
 
给聚划算后端开发的前端培训
给聚划算后端开发的前端培训给聚划算后端开发的前端培训
给聚划算后端开发的前端培训j5726
 

Similar to Go 语言国际电子表格文档格式标准实践 (20)

Golangintro
GolangintroGolangintro
Golangintro
 
The Best Practice of Integrating Apache Flink with Apache Iceberg.pdf
The Best Practice of Integrating Apache Flink with Apache Iceberg.pdfThe Best Practice of Integrating Apache Flink with Apache Iceberg.pdf
The Best Practice of Integrating Apache Flink with Apache Iceberg.pdf
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf
 
Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异Web前端标准在各浏览器中的实现差异
Web前端标准在各浏览器中的实现差异
 
Semantic web 本科课件
Semantic web 本科课件Semantic web 本科课件
Semantic web 本科课件
 
Flex国际化I18N解决方案
Flex国际化I18N解决方案Flex国际化I18N解决方案
Flex国际化I18N解决方案
 
Lotus domino开发教程
Lotus domino开发教程Lotus domino开发教程
Lotus domino开发教程
 
Subversion
SubversionSubversion
Subversion
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式使用 .NET Standard 開發跨平台應用程式
使用 .NET Standard 開發跨平台應用程式
 
Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成
 
Go Lang
Go LangGo Lang
Go Lang
 
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
 
网易相册前端页面开发规范2010版
网易相册前端页面开发规范2010版网易相册前端页面开发规范2010版
网易相册前端页面开发规范2010版
 
從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docs從doc、docx、odt到Google Docs
從doc、docx、odt到Google Docs
 
给聚划算后端开发的前端培训
给聚划算后端开发的前端培训给聚划算后端开发的前端培训
给聚划算后端开发的前端培训
 
Clojure的魅力
Clojure的魅力Clojure的魅力
Clojure的魅力
 

Go 语言国际电子表格文档格式标准实践