前言
微软在UserVoice上运营着一个反馈论坛,每个人都可以在这里提交新点子供他人投票。票数最高的功能请求是“将Python 作为Excel的一门脚本语言”,其得票数差不多是第二名的两倍。尽管自2015年这个点子发布以来并没有什么实质性进展,但在2020年年末,Python 之父Guido van Rossum 发布推文称“退休太无聊了”,他将会加入微软。此事令Excel用户重燃希望。我不知道他的举动是否影响了Excel和Python的集成,但我清楚的是,为何人们迫切需要结合Excel和Python的力量,而你又应当如何从今天开始将两者结合起来。总之,这就是本书的主要内容。
我撰写本书的原动力在于这样一个事实:我们生活在一个充满数据的世界之中。如今,庞大的数据集涉及各个领域,可供任何人访问。而这些数据集常常大到一张工作表难以容纳。几年前,我们可能称其为“大数据”,但现在有几十万行的数据也并不算稀奇。Excel为了跟上潮流也进行了相应的改进:引入了用于加载和清理无法放进工作表的数据的Power Query,以及用于进行数据分析并呈现结果的Power Pivot 插件。Power Query 建立在M 公式语言(简称M)的基础上,Power Pivot 则通过数据分析表达式(data analysis expression,简称DAX)定义公式。如果想对Excel进行自动化,就要使用Excel内置的自动化语言——Visual Basic for Application(VBA)。也就是说,即便要做一些相当简单的工作,你也可能会用到VBA、M和DAX。问题在于,这3 种语言只能在微软的工具中为你服务,特别是对于Excel和Power BI 来说(第1章会简要介绍Power BI)。
而Python 就不一样了,它是一门通用编程语言,并且已然成为最受分析师和数据科学家青睐的编程语言。如果把Python 用到Excel上,那么你在各方面都能体会到Python 带来的好处,无论是自动化Excel,访问、准备数据集,还是执行数据分析、可视化数据。最重要的是,你可以在Excel之外重用你的Python 技能。如果需要更高的算力,那么你可以轻易地将量化模型、模拟、机器学习应用程序迁移到云上——云端有无穷的计算资源在等着你。
写作初衷
xlwings 是一个Excel自动化软件包,本书第四部分会对其进行介绍。在从事xlwings 开发期间,无论是通过GitHub 问题跟踪页,还是Stack Overflow上的问题,甚至是通过线下的各类大会,我都以各种方式与大量为了Excel而使用Python的用户保持着密切联系。
经常会有人让我推荐一些Python 入门教程。虽然Python 入门教程到处都有,但是这些教程要么太宽泛(没有讲任何关于数据分析的内容),要么太专业(全是关于科学原理的内容)。然而Excel用户往往处在一个中间位置:他们的确是和数据打交道,但是科学原理对于他们来说可能又太专业了。他们常常有一些现有教程无法满足的特殊需求,举例如下:
- 为完成某个任务,我应该用哪个Python-Excel包?
- 我如何将Power Query 数据库连接迁移到Python?
- Excel中的AutoFilter 和数据透视表在Python中对应的是什么?
我撰写本书的目的就是让你从对Python一无所知,到能够灵活运用Python的数据分析和科学计算工具。
目标读者
如果你是Excel高级用户,并且想利用一门现代编程语言突破Excel的极限,那么本书就是为你而写的。一般来说,“Excel高级用户”每个月都会花几小时下载、清理、复制和粘贴大量数据到关键的工作表中。当然,有很多方法可以突破Excel的极限,但本书会着重于用Python 来完成。
你应当对编程有基本的了解。如果你写过函数或for
循环(无论是用哪种编程语言写的),并且明白整型和字符串是什么,那么这些经验对阅读本书会有一定帮助。如果你已经习惯于编写复杂的单元格公式或者有调整VBA 宏的经历,那么你应该可以完全掌握本书的内容。阅读本书无须任何针对Python的经验,我会简要介绍我们要用到的工具,其中也包括对Python 本身的介绍。
如果你是VBA 老手,那么书中经常出现的对比Python和VBA的内容可以帮助你避开一些常见的陷阱,从而快速上手。
如果你是Python 开发者,并且需要了解Python 有哪些处理Excel程序和文件的方式,从而为满足商业用户的需求选择合适的软件包,那么本书也是值得一看的。
本书内容结构
本书分为4个部分。
第一部分 Python入门
在介绍本书要用到的工具之前,我们首先会看看为什么Python 能成为Excel的好搭档。随后,第一部分会介绍Anaconda Python发行版、Visual Studio Code和Jupyter 笔记本。在这一部分中,我会教给你足够的Python 知识,以便你掌握本书的剩余部分。
第二部分 pandas入门
pandas 是值得信赖的Python 数据分析库。我们会了解如何利用Jupyter 笔记本和pandas 来替代Excel工作簿。pandas的代码通常更易于维护,并且效率比Excel工作簿更高。不仅如此,你还可以用它来操作一张工作表放不下的数据集。和Excel不同,pandas 让你的代码可以在任何环境中运行,包括云端。
第三部分 在Excel之外读写Excel文件
这一部分讲的是如何运用Python 包来操作Excel文件,比如pandas、OpenPyXL、XlsxWriter、pyxlsb、xlrd和xlwt。这些包能够代替Excel直接读写磁盘上的Excel工作簿,也就是说,你不需要实际安装Excel就能进行这些操作。这些包可以在任何支持Python的平台上工作,包括Windows、macOS和Linux。对于读取Excel文件的包来说,一个典型用例就是每天早上你用它读取从其他公司或者外部系统发来的Excel文件中的数据,然后将这些数据存储在数据库中。而对于写入Excel文件的包来说,你在各种应用程序中都能看到的“导出为Excel文件”按钮,背后就是它的功劳。
第四部分 使用xlwings 对Excel应用程序进行编程
在这一部分中,我们会看到如何使用Python和xlwings 来自动化Excel,而不是直接读写磁盘上的Excel文件。因此,这部分内容需要你在本地安装好Excel。我们会学习如何打开Excel工作簿并实际操作它们。除了通过Excel读写文件,我们还会构建一些交互式Excel工具,从而可以一键让Python 执行一些过去你通过VBA 宏来完成的工作(比如运算量极大的计算)。另外,我们还将学习如何在Python中而不是在VBA中编写用户定义函数1(user-defined function,UDF)。
1微软已经开始使用自定义函数(custom function)这一术语来替代UDF。本书还是会称其为UDF。
理解读写Excel“文件”(第三部分)和对Excel“应用程序”进行编程(第四部分)之间的基本区别非常重要。它们的关系如图P-1所示。
图P-1:读写Excel文件(第三部分)和对Excel应用程序进行编程(第四部分)
学习第三部分无须安装Excel,所有的程序都可以在支持Python的平台(主要是Windows、macOS和Linux)上运行。不过由于第四部分中的程序依赖于本地安装的Microsoft Excel,因此这些代码只能在支持Microsoft Excel的平台(Windows和macOS)上运行。
Python和Excel的版本
本书内容基于Python 3.8。在撰写本书时,这是最新版本的Anaconda Python发行版所用的版本。如果你想用更新版本的Python,请参照本书主页(https://xlwings.org/book)上的说明。不过,千万不要使用低于3.8的版本。如果有些东西在Python 3.9上不一样,我会适时指出。
本书还需要你使用比较新的Excel版本,在Windows中至少需要Excel2007,对于macOS 则是Excel2016以上的版本。本地安装的Microsoft 365中包含的Excel也适用于本书——我甚至更推荐使用365 版本,因为它有其他版本所没有的一些最新功能。在撰写本书时,我用的正是365 版本,如果你用的是其他版本的Excel,那么有些菜单项的名称和位置可能会不同。
排版约定
本书使用下列排版约定。
黑体字
表示新术语或重点强调的内容。
等宽字体(
constant width
)表示程序片段,以及正文中出现的变量名、函数名和数据类型。
等宽粗体(
constant width bold
)表示应该由用户输入的命令或其他文本。
等宽斜体(
constant width italic
)表示应该由用户输入的值或根据上下文确定的值替换的文本。
该图标表示提示或建议。
该图标表示一般性注记。
该图标表示警告或警示。
使用示例代码
我在本书网页上维护着关于本书的额外帮助信息。请一定去看一看,特别是当你遇到问题的时候。
补充材料(如代码、练习等)可以在这里下载:https://github.com/fzumstein/python-for-excel。要下载配套代码库,请点击绿色的Code 按钮,然后选择Download ZIP。下载完成之后,在Windows中右键单击文件,选择“全部解压”将里面的文件解压到一个文件夹中。在macOS中,双击文件解压即可。如果你知道怎么用Git,也可以用Git 将代码库克隆到本地。你可以随便把它放在哪里,但我时常会像下面这样引用这些文件:
C:\Users\username\python-for-excel
如果你在Windows中下载并解压了上述ZIP 文件,则会得到类似下面这样的文件夹结构(注意重复的文件夹名称):
C:\...\Downloads\python-for-excel-1st-edition\python-for-excel-1st-edition
将这个文件夹中的内容复制到C:\Users\<username>\python-for-excel 文件夹中以便跟进本书学习。以上操作也适用于macOS,只是要将这些内容复制到/Users/<username>/python-for-excel中。
本书旨在帮助你完成工作。一般来说,你可以在自己的程序或文档中使用本书提供的示例代码。除非需要复制大量代码,否则无须联系我们获得许可。比如,使用本书中的几个代码片段编写程序无须获得许可,销售或分发O'Reilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无须获得许可,将本书中的大量示例代码放到你的产品文档中则需要获得许可。
我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明通常包括书名、作者、出版社和ISBN,比如“Python for Excel, by Felix Zumstein (O'Reilly). Copyright 2021 Zoomer Analytics LLC, 978-1-492-08100-5”。
如果你觉得自己对示例代码的用法超出了上述许可的范围,欢迎你通过permissions@oreilly.com 与我们联系。
O'Reilly在线学习平台(O'Reilly Online Learning)
40多年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独特的由专家和创新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly的在线学习平台让你能够按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O'Reilly和200 多家其他出版商提供的大量文本资源和视频资源。有关的更多信息,请访问https://www.oreilly.com。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
O'Reilly的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息2。本书的网页是https://oreil.ly/py4excel。
对于本书的评论和技术性问题,请发送电子邮件到bookquestions@oreilly.com。
要了解更多O'Reilly 图书、培训课程和新闻的信息,请访问以下网站:https://www.oreilly.com。
我们在Facebook的地址如下:http://facebook.com/oreilly。
请关注我们的Twitter 动态:http://twitter.com/oreillymedia。
我们的YouTube 视频地址如下:http://www.youtube.com/oreillymedia。
2也可以通过图灵社区本书主页下载示例代码或提交中文版勘误。——编者注
致谢
这是我第一次写书,我十分感谢一路上帮助我的各位,他们帮我渡过了许多难关!
首先感谢O'Reilly的编辑Melissa Potter,她帮我保持充足的动力,按计划完成了本书。我也要感谢Michelle Smith,她和我一起完成了本书的初稿。还要感谢Daniel Elfanbaum,他总是乐于回答我提出的技术问题。
万分感谢我的同事、朋友以及客户,他们花大量时间阅读了本书的早期版本。正是有了他们的反馈,本书才能变得更加易懂,并且书中的一些案例研究都是来自他们分享的源自现实的Excel问题。感谢Adam Rodriguez、Mano Beeslar、Simon Schiegg、Rui Da Costa、Jürg Nager和Christophe de Montrichard。
我也十分感谢Felipe Maion、Ray Doue、Kolyu Minevski、Scott Drummond、Volker Roth和David Ruggles。他们阅读了发布在O'Reilly在线学习平台的抢先发布版本,我对他们提供的反馈表示感谢。谢谢你们!
本书有幸得到了各位高级技术审校人员的审阅,我十分感谢他们在有限时间中的辛勤付出。感谢以下各位的帮助:Jordan Goldmeier、George Mount、Andreas Clenow、Werner Brönnimann和Eric Moreira。
特别感谢Björn Stiel。他不仅是一位技术审校,我还从他那里学到了很多关于书中那些技术的知识。我十分享受与他共事的日子!
最后,我想对Eric Reynolds表示感谢,他于2016年将他的ExcelPython项目合并到xlwings代码库中。他还从头开始重新设计了整个包,彻底修改了我早期编写的糟糕的API。十分感谢!
更多信息
扫描下方二维码,即可获取电子书相关信息及读者群通道入口。