python的一大优势是生态丰富,各种想要的库都有人做好了,省掉造轮子的成本。对于Excel文件操作,也不例外。在Python中操作Excel有2条思路。

  1. 使用pywin32,内含win32com等多个包,使用微软独门的COM接口技术去操控系统中的Excel软件。沿着这条思路,好处是除了Excel软件,可以操控系统中任意支持COM接口的软件,微软全家桶是必然在列滴,其他就难说了;劣势就是COM接口技术比较老旧了,仅在Windows平台中使用,而且系统中必须已经安装好Excel软件。
  2. 使用读写表格文件的库,如xlrd/xlwt/xlutilsopenpyxlpyexcelXlsxWriter等,这些库封装了对Excel文件的读写操作的函数。
    在Python中操作Excel文件

本文对第2条思路中常见的库进行简单评述与总结。

0x00 xlrd/xlwt/xlutils

简介

这3个必须捆绑到一起说。Simplistix公司开发了这3个库,还提供了一个教程Working with Excel files in Python,教程是2009年出的,原网站内容基本都清空了,项目迁移到http://www.python-excel.org,教程迁移到https://github.com/python-excel/tutorial

  • xlrd用于读取Excel文件表格中的数据,rd含义就是read,同时支持xls和xlsx两种格式标准
  • xlwt用于将数据写入Excel文件,wt含义就是write,仅支持xls格式标准
  • xlutils依赖于xlrdxlwt,提供读写相关支持的工具集,比如类型转换、workbook复制等。

吐槽一句,这3个东西原本应该做到一起的,搞成3个麻烦。

xls和xlsx格式

注意文件后缀名跟格式标准没关系,不是说文件扩展名用xlsx就一定是xlsx格式、用xls就一定是xls格式,而是两种格式标准文件在数据组织方式、数据量支持等多方面就存在本质差异。微软自Office 2007系列之后开始广泛支持xlsx格式标准,使用xls格式标准的文件逐渐减少。
xls是微软私有的文件格式标准,以二进制方式直接保存文件,最大支持行数65536行、列数256列,而xlsx是基于Office Open XML标准的格式,实质是以zip压缩包保存文件,只是扩展名使用了xlsx,可以用解压软件查看压缩包内容,最大支持1048576行、16384列。

主要特性

xlrd/xlwt是以非常原始的方式进行Excel表格数据读写,可以类比为CPU编程的汇编语言、Web开发中的JavaScript,好处嘛就是运行速度相对快,缺点就是代码要写得比较啰嗦。xlrd/xlwt实现了Book(工作簿)、Sheet(表单)、Cell(单元格)多级对象,并将单元格分为文本(Text)、数字(Number)、日期(Date)、布尔(Boolean)、错误(Error)、空白(Empty/Blank)几种类型。比较蛋疼的是,xlrd中的Book和xlwt中Book并非是同一类型,在Book对象中获取Sheet对象的方法也不同,正因为如此,才需要xlutils做中间桥梁进行转换。

xlrd/xlwt对Excel文件支持较好,除了常规数据读写,还支持单元格字体、边框线风格,还支持写入表格公式,但实际使用表明大量公式不支持,读入表格只能得到公式值,另外不支持图表绘制。

在数据访问方面,xlrd/xlwt可以整行/列操作,单元格索引则完全依赖行列序号,但提供了函数用于行列序号与Excel风格单元格地址相互转换。

xlrd/xlwt/xlutils对外暴露的类型、方法、函数中规中矩,也没有什么花式操作,用户只了解最常用的小部分也能完成工作。

0x01 openpyxl

简介

openpyxl是由一群志愿者在业余时间开发维护的开源项目,用于在Python中原生地读写Excel xlsx/xlsm/xltx/xltm格式文件,项目地址 http://bitbucket.org/openpyxl/openpyxlopenpyxl对Excel文件功能支持十分完备:除了常规数据读写,还支持单元格合并/分拆、插入图片、(有限的)图表绘制、公式写入/解析、单元格注释、只读/只写模式、单元格字体/对齐/填充/边框线风格、条件格式、数据有效性等。

主要特性

在数据访问方面,openpyxl支持整行/列操作,单元格索引既可以用行列序号,也可以用Excel风格单元格地址,内部自动转换无需用户操心。

Excel功能支持方面,openpyxl堪称完美,但最大痛点是不支持xls格式,而目前实际仍有不少xls格式文件在应用中。

0x02 XlsxWriter

简介

XlsxWriter是用于创建Excel xlsx格式文件的包,仅支持写操作,不支持xls格式,非常适合于生成新表格文件的应用场合,对于读出表格数据进行分析则无能为力。XlsxWriter开源,项目地址为 https://github.com/jmcnamara/XlsxWriter

在Excel功能支持方面十分完备,XlsxWriter支持单元格合并/分拆、图片插入、图表绘制、公式、单元格注释、单元格数字格式/字体/对齐/填充/边框线风格、条件格式、数据有效性、文本框插入、VBA等,还能与pandas集成进行数据分析,运行效率也很高。

主要特性

XlsxWriter在写入数据方面设计很有特点,对外只暴露1个write方法,内部则根据要写入的数据格式(Excel单元格所规定的数字、字符串、公式、空白、日期时间、链接等),回调相应的handler,同时允许用户添加自定义handler,在匹配自定义数据格式时自动回调。这样设计仅需掌握1个write方法便可搞定所有的写操作,简洁明了,保持灵活性同时不失统一性。

在数据访问方面,XlsxWriter支持整行/列操作,单元格索引既可以用行列序号,也可以用Excel风格单元格地址,内部自动转换无需用户操心。

XlsxWriter对外暴露的类型、方法、函数相对较为简洁,数量也不多,风格也很统一,用户上手十分容易,提供的文档和样例十分丰富。

0x03 pyexcel

简介

与上述几个库所不同的是,pyexcel是一个包装库,底层依赖实际是xlrd/xlwtopenpyxlXlsxWriterlxml等,经过封装后对外提供一套API进行Excel文件读写,可类比为CPU编程的C语言、Web开发中的jQuery等,好处就是简化了代码编写过程,缺点就是运行效率降低了。pyexcel开源,项目地址为https://github.com/pyexcel/pyexcel

除了支持Excel的xls、xlsx格式,还支持csv、tsv文本格式,以及sql数据库表、Python内置的dict/嵌套list数据类型等,让用户专注于处理表格数据,不必操心数据存储介质的细节,另外对字体/颜色/边框风格、图表绘制、公式等均不支持

主要特性

pyexcel被设计为插件式,模块化地支持各种功能,默认安装只有pyexcelpyexcel-io两个包,仅支持csv、tsv文本格式,对Excel表格支持就是通过各种插件完成的,用户完全根据自己所需只安装必要的插件而不影响整体功能。

  • 对xls的格式读写支持由pyexcel-xls插件完成,依赖于xlrd/xlwt
  • 对xlsx的格式读写支持由pyexcel-xlsx插件完成,依赖于openpyxl
  • 只写xlsx的支持由pyexcel-xlsxw插件完成,依赖于XlsxWriter
  • 只读xlsx的支持由pyexcel-xlsxr插件完成,依赖于lxml
  • 对ods(Open Document Spreadsheet,开放文档表单,在Open Office等开源办公软件中使用广泛)格式的读写支持由pyexcel-ods插件完成,依赖于odfpy
  • 其他更多格式支持详情,参考库文档。

在数据访问方面,pyexcel支持整个表单、整行/列、矩形区操作,单元格索引既可以用行列序号,也可以用Excel风格单元格地址,内部自动转换无需用户操心。

pyexcel对外暴露的类型、方法、函数种类繁多,参数繁多,功能多样,用户可能只需要了解其中少部分就能完成工作。

0x04 小结

对以上几个库的主要特性和不足总结对此如下。
Python中操作Excel的几种常见库对比

上述几个库对数据分析即使有支持也十分有限,主要用来读出/写入文件,中间的数据分析过程嘛,则可以交给其他库来完成,充分发挥Python生态极度丰富的优势,如numpypandas等。

若是要处理的表格文件较少,最快捷的方式仍然是各种办公软件,微软的Office、金山的WPS、开源的Open Office / Libre Office等。遇到大量重复性的表格文件,才有必要通过程序自动化。面对这么多Excel表格文件操作库,该如何选择?如果要格式和功能的广泛支持,首选xlrd/xlwt/xlutilspyexcel;如果没有兼容xls格式的包袱,首选openpyxl;如果只需要在应用中导出/生成表格,则首选XlsxWriter

参考

更多阅读


如本文对你有帮助,或内容引起极度舒适,欢迎分享转发或点击下方捐赠按钮打赏 ^_^