书名:Excelize权威指南
ISBN:978-7-115-63647-8
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 续 日
责任编辑 刘雅思
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书基于Excelize基础库,从Office办公文档格式国际标准出发,以源代码为基础,结合大量直观的配图,循序渐进地讲解Excelize中的模块实现,详细解读技术标准内容和基础库的设计。主要内容包括Excelize开发环境准备、文档格式国际标准解读、文档数据结构建模、工作簿、工作表、单元格和行列的相关操作、复杂样式解析、图表、图片与形状的相关操作、数据验证与筛选、数据透视表、流式读写技术以及一个综合实践应用。阅读本书,具有一定Go语言基础,想入门Excelize的开发者能够进一步系统理解Excelize基础库的实现细节,不具备Go语言开发经验的开发者也能够快速掌握Excelize的设计原理。
欢迎阅读《Excelize权威指南》!本书会深入浅出地讨论Excelize开源基础库的设计与使用。自1978年电子表格被创造以来,电子表格应用已经有数十年的历史。时至今日,以Excel为代表的电子表格应用依然无法被其他形式的某个应用完全取代。电子表格作为一种结构化的数据,能够有效地组织信息;借助电子表格应用可以高效地对数据进行分析和处理,从而简化很多需要人工计算的工作;经过分析的数据可以通过图表的形式可视化呈现,从而帮助人工决策。随着信息产业的发展,电子表格文档在教育、医疗、金融等千行百业已被广泛应用。
身处“数字”时代,数据时刻伴我们左右。不论你是专业的软件工程师、数据分析师、互联网产品经理、项目经理,还是从事文秘、人力资源、市场销售等工作或者深度使用电子表格办公软件的人士,掌握数据处理与分析的能力,都将对工作带来极大的帮助。Excelize开源基础库提供了简单易用的函数,能够帮助你通过程序设计的方式高效地实现办公自动化,对电子表格中的数据进行统计、分析和批量处理。
如今,每年世界上的办公文档数量至少以数百亿的规模在增长,在实际应用中有大量场景需要通过程序设计的方式自动化地处理电子表格文档,比如企业应用中,很多信息化系统需要提供导入和导出电子表格文档的功能。从传统的纸质报表到电子表格,从电子表格到数据的云端处理,再到以数据为基础的SaaS,电子表格自动化处理在企业数字化建设和云计算市场中具有很高的商业价值。
Excelize是用Go语言编写的用来处理电子表格文档的开源基础库,遵循BSD 3-Clause开源许可协议。它提供了高性能处理电子表格文档的功能,已经被广泛应用于大型互联网公司、初创公司等不同规模的企业。通过程序设计的方式处理电子表格文档,开源领域已经有一些选择,比如在C、C++、C#、Java、JavaScript、PHP、Python、Ruby、Rust等程序设计语言中都有此类开源产品,但是,不知道你是否已经发现,这类产品在功能、性能和兼容性上存在很大的差异。有经验的开发者也许遇到过,使用一些开源电子表格文档基础库处理较为复杂的文档时,生成的文档被Excel等电子表格应用打开后可能会出现“样式错乱”“内容丢失”,甚至是“文档损坏”的情况,而且这是此类基础库普遍存在的问题,其原因在于电子表格文档拥有复杂、庞大的文档格式标准体系,即便是商业电子表格应用也难以保证同一文档在不同厂商、不同版本的应用中打开的效果完全一致,这正是此类开源产品数量不多且难以做到较好兼容性的原因。
Excelize基础库采用兼容性第一的设计原则,在设计上能够最大限度地保证文档兼容性,实现高保真编辑。得益于Go语言的跨平台优势,Excelize可以在不依赖Office应用程序的前提下,在Linux、Windows、macOS、嵌入式操作系统等操作系统中跨平台地进行电子表格文档的处理。Excelize支持XLSX、XLAM、XLSM、XLTM等多种文档格式,并兼容带有样式、图片、图表、数据透视表等高级功能组件的文档,还提供流式读写能力,用于处理包含大规模数据的工作簿。
为此,笔者结合电子表格文档的技术标准和Excelize基础库的研发心得撰写本书,希望能够带领你开启一段轻松而有收获的学习之旅,希望通过这段旅程能够让你由浅入深地了解并学习Excelize开源基础库的使用方法和背后的原理,在使用它进行电子表格文档数据处理和分析时更加从容、得心应手。
通常情况下我们建议读者按照顺序阅读本书。本书首先介绍Excelize的安装,接着简单地介绍电子表格文档的相关概念,然后在后续章节中逐步深入讲解文档格式、Excelize基础库的设计与实现原理,并对Excelize基础库提供的各项功能细节展开讨论。总的来说,除第 1 章外,后面每一章的内容建立在前一章所引入的概念上。对已经有开发经验的读者来说,本书也可作为开发工作中查阅参考的工具资料使用。
本书共18章,分为5篇,全面、系统、有针对性地介绍Go语言的Excelize开源基础库的原理、设计、实现和各项功能的使用方法。
第一篇(第1章、第2章)作为入门指南,主要讨论如何从零开始学习Excelize,这一部分将从Go语言开发环境的搭建讲起,逐步介绍Excelize版本的选择、基础库的安装,并将介绍如何快速使用Excelize编写两个简单的程序。
第二篇(第3章~第5章)会从基础库设计的角度对Excelize基础库进行介绍。第3章会从全局视角来讨论笔者在Excelize基础库的设计过程中的思考。第4章会介绍Excelize基础库背后的技术原理,对办公文档格式标准进行解读。第5章会介绍Excelize基础库设计的核心要素和基础库架构设计,以及它是如何实现电子表格文档格式标准的。如果你对Excelize开源基础库的原理很感兴趣,那么本书的第二篇非常适合你。如果你是一个希望了解清楚每个功能的细节的学习者,那么你可以先跳过第二篇,从本书的第三篇开始按照顺序阅读,在结合实践完整地了解 Excelize 基础库的各项功能之后,再回到第二篇进行阅读。
第三篇(第6章~第15章)将会深入讲解Excelize的核心技术与提供的各项功能。第6章会介绍文档数据结构模型的建立过程,这将会帮助你了解基础库的实现原理,学会排查开发过程中遇到的问题,并学会扩展 Excelize 基础库的功能。第7章会讨论工作簿处理的相关函数。第8章会介绍如何使用Excelize管理工作表。第9章将会深入讲解单元格相关的处理方法。第10章主要介绍行列处理的相关功能,其中包括批量获取单元格的方法等。第11章会详细讨论如何使用Excelize基础库在工作簿中创建和设置各种样式,以及条件格式的相关操作。第12章会讨论利用图表对数据进行可视化分析的方法,其中会介绍如何使用Excelize基础库创建不同类型的图表与各种图表格式选项的使用。第13章会讲解图片与形状相关的处理函数。第14章会讨论如何对工作表中的数据进行验证与筛选。第15章会介绍如何使用Excelize基础库对数据进行透视分析。
第四篇(第16章、第17章)主要讨论为读写包含大规模数据的工作簿而设计的流式读写方法。第16章会讨论流式读写的基本原理、设计思路与关键实现要点。第17章会详细介绍Excelize基础库提供的各个流式读写函数。
第五篇(第18章)将开发两个完整的案例,通过这两个案例复习并综合运用Excelize基础库的各项功能。
当然,怎样阅读本书都是可以的,本书中对所有存在上下文关联的知识点都做了明确的标注,你可以在感到困惑时再返回之前跳过的部分。
想要熟练掌握任何一种技术都离不开动手实践,学习 Excelize 基础库亦是如此。建议读者在阅读本书的过程中,对照书中的示例代码,自己动手编写和运行代码,进行实验。读者可以从 GitHub网站(用户名xuri)下载本书中所有的示例代码,笔者将以最大努力确保本书内容准确无误。但金无足赤,书中难免存在一些疏漏,如果读者发现代码、描述等内容存在任何错误或不准确之处,或者有对本书的建议或意见,请及时反馈给笔者。本书勘误请在GitHub网站(用户名xuri)上查看或提交。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供如下资源:
● 本书源代码;
● 本书案例中使用的数据集。
要获得以上配套资源,您可以扫描下方二维码,根据指引领取。
您也可以在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“发表勘误”,输入勘误信息,点击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
本书责任编辑的联系邮箱是liuyasi@ptpress.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书技术审校等工作,可以发邮件给我们。
如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区。异步社区于2015年8月上线运营,致力于优质学习内容的出版和分享,为读者提供优质学习内容,为作译者提供优质出版服务,实现作者与读者在线交流互动,实现传统出版与数字出版的融合发展。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。
千里之行,始于足下。现在让我们开始了解Excelize基础库的旅程。Excelize是基于Go语言编写的电子表格文档基础库,我们会在本篇准备好Go开发环境,熟悉Excel软件的基本概念,这将会帮助读者更好地学习随后章节中的内容。本篇还将编写简单的程序,以此来帮助读者快速熟悉Excelize基础库。
学习Excelize的第一步自然是准备开发环境,如果你尚未接触过Go语言也没有关系,通过本章你将了解到在多种操作系统平台下如何搭建Excelize开发环境,以及如何选择开发工具。开发环境搭建涉及Go语言和依赖工具链的安装,在这个过程中需要保障网络连接的稳定。
如果你正在使用的是Linux或者macOS操作系统,首先打开浏览器访问Go语言官方网站的下载页面,如图1-1所示。
图1-1 Go语言安装文件下载页面
在下载页面上的安装文件列表中可以看到,有一系列以go[version].[os]-[arch].tar.gz形式命名的压缩包文件,其中version代表Go语言版本,os代表安装文件所适配的操作系统,arch代表安装文件所支持的CPU架构,推荐下载当前最新的稳定版本(Stable Version),根据CPU架构选择对应的安装文件。例如,如果当前Go语言的最新版本是1.22.3,可按如下原则进行选择:
● 如果你正在使用的是基于 x86 处理器架构(Intel芯片)的macOS 64位操作系统,则下载go1.22.3.darwin-amd64.tar.gz安装文件;
● 如果你正在使用的是基于 ARM 处理器架构(M系列芯片)的macOS 64位操作系统,则下载go1.22.3.darwin-arm64.tar.gz安装文件;
● 如果你正在使用的是基于x86处理器架构的Linux 32位操作系统,则下载go1.22.3.linux-386.tar.gz安装文件。
● 如果你正在使用的是基于x86处理器架构的Linux 64位操作系统,则下载go1.22.3.linux-amd64.tar.gz安装文件;
假设我们把安装文件下载到当前登录用户的家(home)目录下,那么请打开命令行界面,执行如下命令,将工作目录切换到家目录下:
$ cd
接着,在命令行界面中执行如下命令来解压缩刚刚下载的安装文件:
$ tar zxf go*.tar.gz
解压缩完毕后将得到一个名为go的目录,将该目录移动至/usr/local/etc系统目录下,如果该目录不存在,则可以通过如下命令进行创建:
$ mkdir /usr/local/etc
可以在命令行界面中执行如下命令,把解压缩后得到的go目录移动至/usr/local/etc系统目录下:
$ mv go /usr/local/etc
接着我们来设置系统环境变量,在~/.bash_profile文件中添加如下语句,将Go语言相关目录添加到环境变量PATH中:
export GOROOT=/usr/local/etc/go
export PATH="$GOROOT/bin:$PATH"
如果你所使用的Go为1.15及之前的版本,或未使用Go Module模式进行软件包管理,则需要再添加如下语句到~/.bash_profile文件中来设置GOPATH环境变量:
export GOPATH="$HOME/workspace"
上面的这行语句定义了GOPATH环境变量,它是用绝对路径表示的项目工作目录,但是这种模式不再被推荐使用,因为在该模式下,安装的依赖包均为最新版本,缺少版本管理机制。如果继续使用GOPATH模式进行软件包管理,后续Excelize项目的开发都将在此目录下进行,我们把它设置为当前登录用户的家目录下的workspace目录,在命令行界面中执行如下命令来创建该workspace目录:
$ mkdir ~/workspace
在完成环境变量的设置后,为了使当前命令行界面的环境变量立即生效,可以在命令行界面中执行如下命令:
$ source ~/.bash_profile
至此Go语言的开发环境就搭建好了!现在,在命令行界面中执行go version来检查已安装的Go语言的版本,得到类似如下输出,就说明安装成功了:
go version go1.22.3 darwin/amd64
另外,还可以在命令行界面中通过执行go env命令检查Go语言的环境信息,本书不再赘述。
如果你正在使用的是Windows操作系统,由于后续需要使用的go get、go install等Go语言的相关命令都依赖Git版本控制软件的支持,因此需要先前往Git官方网站下载安装文件来安装Git客户端,如图1-2所示。点击页面上的“Download for Windows”按钮进行下载。如果你使用的是64位的Windows操作系统,则下载对应的64位Git安装文件:64-bit Git for Windows Setup。如果你使用的是32位的Windows操作系统,则需要下载对应的32位Git安装文件:32-bit Git for Windows Setup。下载完毕后使用默认的安装配置进行安装。
图1-2 Git安装文件下载页面
Git安装完毕后访问Go语言官方网站的下载页面,下载当前最新的稳定版本的安装文件,假设当前 Go 语言的最新版本是 1.22.3,如果你正在使用的是 64 位的Windows操作系统,则下载go1.22.3.windows-amd64.msi 安装文件;如果你正在使用的是 32 位的Windows操作系统,则下载go1.22.3.windows-386.msi 安装文件。下载完成后运行安装程序,默认的安装目录位于 C:\Program Files\Go\。安装完毕后按如下步骤设置系统环境变量。
(1)打开“系统”→“关于”窗口。
(2)点击“高级系统设置”。
(3)在“高级”选项卡中点击“环境变量”。
(4)在“环境变量”设置对话框里,将Go语言可执行文件所在目录添加到操作系统环境变量Path中:编辑用户变量中的“Path”条目,新增“C:\Program Files\Go\bin”;
(5)如果你所使用的Go语言为1.15及之前的版本,或未使用Go Module模式进行软件包管理,则还需要添加一项名为“GOPATH”的环境变量,值为“%USERPROFILE%\workspace”,如图1-3所示。
第(5)步创建的GOPATH环境变量是用绝对路径表示的项目工作目录,后续Excelize项目的开发都将在此目录下进行,我们把它设置为当前登录用户目录下的workspace目录,并创建对应的文件夹。
图1-3 添加GOPATH环境变量
本书中使用的大部分命令行语句都可以同时在命令提示符窗口和PowerShell中运行。若有特殊情形,会单独说明。
安装完毕后,你可以通过如下命令检查Go是否安装成功:
$ go version
一切顺利的话,你可以在命令输出中看到如下格式的安装的Go版本的信息:
go version go1.22.3 windows/amd64
也可以在命令行界面中执行如下命令来检查Go环境信息:
$ go env
至此,我们就完成了在Windows操作系统中的Go语言环境搭建。
上方是通过标准包的方式来搭建Go语言环境的,这种方式非常适合初学者。我们还可以通过源代码或第三方软件工具包进行搭建,例如在macOS操作系统中通过homebrew搭建、在Ubuntu操作系统中通过apt搭建等。
一般的文本编辑工具就可以胜任Excelize的开发,如果你需要具有自动化提示、代码补全、代码高亮着色和自动格式化功能的开发工具,那么下面几款常用的开发工具可以供你选择:
● Visual Studio Code,这是一款免费开源的代码编辑器,在安装完该编辑器后,可以在其插件市场下载Go语言官方插件并安装,以获得更好的支持;
● GoLand集成开发编辑器,安装后不需要过多配置即可获得较为完善的Go语言支持;
● Sublime Text编辑器,建议安装语言服务协议(Language Server Protocol,LSP)以及LSP-gopls插件以获得更好的支持。
此外,Vim、Emacs、LiteIDE和Eclipse等编辑器也可以用于Go语言Excelize项目的开发,这些编辑器大都提供了跨平台支持,你可以从中选择一款自己喜爱的编辑器。
在使用Excelize基础库编写应用程序之前,有必要了解一下电子表格应用程序中的基本概念,这将有助于你更好地理解本书后续章节的内容。打开电子表格应用程序,这里以Excel为例,你也可以使用其他电子表格应用程序(不同电子表格应用程序的操作界面略有不同,但是其基本概念是相同的)。打开Excel电子表格应用程序后看到的界面如图1-4所示。
图1-4 Excel电子表格应用程序界面
Excel 文档的主要内容基本上都是由图上这些小方格组成的,每一个小方格被称为“单元格”,单元格可以用来输入数据或者设置公式。此外,Excel文档还有一个很重要的特点,就是每个单元格都有如同地图上的坐标的特定参照位置,例如图1-4中被框选的单元格的参照位置是D5,被框选的单元格也被称为“活动单元格”。每一个Excel文档被称为“工作簿”,图1-4所示的工作簿名称为“工作簿1”。每一个工作簿可以包含多个工作表,打开工作簿时默认的工作表被称为“活动工作表”。使用Excel新建工作簿时会默认创建一个名为“Sheet1”的工作表,使用Excelize基础库创建工作簿时也是如此。
Excelize支持处理多种文档格式,表1-1列出了其支持的文档格式类型。
表1-1 Excelize支持的文档格式类型
文档扩展名 |
描述 |
---|---|
xlsx |
最为常见的Excel文档格式,不能存储VBA(Visual Basic for Applications)工程 |
xlam |
开启了宏的加载项的文档格式,支持内部嵌入VBA工程 |
xlsm |
开启了宏的工作簿,支持内部嵌入VBA工程 |
xltm |
开启了宏的Excel模板文档,支持内部嵌入VBA工程 |
xltx |
Excel模板文档,不能存储VBA工程 |
你已经踏上了自己的Excelize旅程!本章从零开始,准备好了编写Excelize项目所需的开发环境,接着选择了开发工具,最后还讲解了电子表格文件中的基本概念,这些概念将在后续的章节中被提及。现在,是时候来创建第一个Excelize项目了。假如你希望从更为基础的原理开始,优先学习Excelize内部的实现与技术标准,那么你可以在阅读第3章后再来阅读第2章。