0. 前言

从网页爬下来的大量数据需要清洗?

成堆的科学实验数据需要导入 Excel 进行分析?

有成堆的表格等待统计?

作为人生苦短的 Python 程序员,该如何优雅地操作 Excel?

得益于前人的辛勤劳作,Python 处理 Excel 已有很多现成的轮子,使用较多的有:

xlwings

openpyxl

pandas

win32com

xlsxwriter

DataNitro

xlutils

上次我们介绍了下 xlutils,不少读者留言表示有比它更好使的模块,于是我们又把另外几个都体验了一遍。

本文将从运行环境、文档操作、基本功能和性能等方面对以上模块进行一次粗浅的比较,供大家参考。

1. 环境配置

再好的模块,也需要在正确的 Python 版本以及 Excel 版本才可运行。

提醒及注意:

xlutils 仅支持 xls 文件,即2003以下版本;

win32com 与 DataNitro 仅支持 windows 系统;

xlwings 安装成功后,如果运行提示报错“ImportError: no module named win32api”,请再安装 pypiwin32 或者 pywin32 包;

win32com 不是独立的扩展库,而是集成在其他库中,安装 pypiwin32 或者 pywin32 包即可使用;

DataNitro 是 Excel 的插件,安装需到官网下载。

2. 文档操作

虽然大家都是操作 Excel,但即使最基本的新建文件、修改文件、保存文件等功能,在不同的库中也存在差异。比如 xlsxwriter 并不支持打开或修改现有文件,xlwings 不支持对新建文件的命名,DataNitro 作为 Excel 插件需依托于软件本身,pandas 新建文档需要依赖其他库等等。

3. 基本功能

由于设计目的不同,每个模块通常着重于某一方面功能,各有所长。

xlwings

可结合 VBA 实现对 Excel 编程,强大的数据输入分析能力,同时拥有丰富的接口,结合 pandas/numpy/matplotlib 轻松应对 Excel 数据处理工作。

openpyxl

简单易用,功能广泛,单元格格式/图片/表格/公式/筛选/批注/文件保护等等功能应有尽有,图表功能是其一大亮点,缺点是对 VBA 支持的不够好。

pandas

数据处理是 pandas 的立身之本,Excel 作为 pandas 输入/输出数据的容器。

win32com

从命名上就可以看出,这是一个处理 windows 应用的扩展,Excel 只是该库能实现的一小部分功能。该库还支持 office 的众多操作。需要注意的是,该库不单独存在,可通过安装 pypiwin32 或者 pywin32 获取。

xlsxwriter

拥有丰富的特性,支持图片/表格/图表/筛选/格式/公式等,功能与openpyxl相似,优点是相比 openpyxl 还支持 VBA 文件导入,迷你图等功能,缺点是不能打开/修改已有文件,意味着使用 xlsxwriter 需要从零开始。

DataNitro

作为插件内嵌到 Excel 中,可完全替代 VBA,在 Excel 中使用 python 脚本。既然被称为 Excel 中的 python,协同其他 python 库亦是小事一桩。然而,这是付费插件...

xlutils

基于 xlrd/xlwt,老牌 python 包,算是该领域的先驱,功能特点中规中矩,比较大的缺点是仅支持 xls 文件。

4.性能

我们对几个库做了最基本的写入和读取测试,分别使用不同库进行添加及读取 1000行 * 700列 数据操作,得到所用时间,重复操作取平均值。另外在不同的电脑配置,不同的环境下结果肯定会有出入,数据仅供参考。

注:

xlutils 最多只能写入 256 列,即 1000*256,用时3.8秒,表现不错;

DataNitro 与 xlsxwriter 不能打开 Excel 文件。

5. 小结

通过以上的分析,相信大家对几个库都有了简单的了解。在编写文章的过程中,笔者也在思考各个库最适合的应用场景。

不想使用 GUI 而又希望赋予 Excel 更多的功能,openpyxl 与 xlsxwriter,你可二者选其一;

需要进行科学计算,处理大量数据,建议 pandas+xlsxwriter 或者 pandas+openpyxl;

想要写 Excel 脚本,会 Python 但不会 VBA 的同学,可考虑 xlwings 或 DataNitro;

至于 win32com,不管是功能还是性能都很强大,有 windows 编程经验的同学可以使用。不过它相当于是 windows COM 的封装,自身并没有很完善的文档,新手使用起来略有些痛苦。

你可根据自己的需求和生产环境,选择合适的 Python-Excel 模块。

6. 代码示例

最后,附上一些演示代码,大家可自行体会下不同模块的使用。

6.1 xlwings基本代码

import xlwings as xw

#连接到excel

workbook = xw.Book(r'path/myexcel.xlsx')#连接excel文件

#连接到指定单元格

data_range = workbook.sheets('Sheet1').range('A1')

#写入数据

data_range.value = [1,2,3]

#保存

workbook.save()

6.2 xlsxwriter基本代码

import xlsxwriter as xw

#新建excel

workbook = xw.Workbook('myexcel.xlsx')

#新建工作薄

worksheet = workbook.add_worksheet()

#写入数据

worksheet.wirte('A1',1)

#关闭保存

workbook.close()

6.3 xlutils基本代码import xlrd #读取数据

import xlwt #写入数据

import xlutils #操作excel

#----xlrd库

#打开excel文件

workbook = xlrd.open_workbook('myexcel.xls')

#获取表单

worksheet = workbook.sheet_by_index(0)

#读取数据

data = worksheet.cell_value(0,0)

#----xlwt库

#新建excel

wb = xlwt.Workbook()

#添加工作薄

sh = wb.add_sheet('Sheet1')

#写入数据

sh.write(0,0,'data')

#保存文件

wb.save('myexcel.xls')

#----xlutils库

#打开excel文件

book = xlrd.open_workbook('myexcel.xls')

#复制一份

new_book = xlutils.copy(book)

#拿到工作薄

worksheet = new_book.getsheet(0)

#写入数据

worksheet.write(0,0,'new data')

#保存

new_book.save()

6.4 win32com基本代码

import win32com.client as wc

#启动Excel应用

excel_app = wc.Dispatch('Excel.Application')

#连接excel

workbook = excel_app.Workbooks.Open(r'e:/myexcel.xlsx' )

#写入数据

workbook.Worksheets('Sheet1').Cells(1,1).Value = 'data'

#关闭并保存

workbook.SaveAs('newexcel.xlsx')

excel_app.Application.Quit()

6.5 openpyxl基本代码

import openpyxl

# 新建文件

workbook = openpyxl.Workbook()

# 写入文件

sheet = workbook.activesheet['A1']='data'

# 保存文件

workbook.save('test.xlsx')

6.6 DataNitro基本代码

#单一单元格赋值

Cell('A1').value = 'data'

#单元区域赋值

CellRange('A1:B2').value = 'data'

其他文章及回答:

Crossin的编程教室

微信ID:crossincode

pythonexcel模块哪个好_Python-Excel 模块哪家强?相关推荐

  1. pythonos模块使用方法_Python OS模块常用方法总结

    Python OS模块常用方法总结 Python OS模块方法: 操作 说明 os.getcwd() 得到当前工作目录,即当前Python脚本工作的目录路径 os.listdir() 返回指定目录下的 ...

  2. python logging模块的作用_Python 日志模块logging分析及使用-2

    本文作为Python日志模块的补充,主要介绍日志回滚RotatingFileHandler和TimedRotatingFileHandler的使用,以及其所带来的问题.Logger对象的日志等级是如何 ...

  3. python中模块的概念_Python中模块的概念

    """ 模块搜索顺序 sys.path 查看搜索顺序 """ """ 编程语言中,库.包.模块是同一种概念,是 ...

  4. pythonos模块怎么设置_Python OS模块如何使用?

    对于Python的模块,跟大家说过很多内容,但是大家有没有了解过OS模块呢?想到这个模块,大家有没有想到我们之前提及的其他内容呢?比如sys模块呢?没错,这两个模块之前是存在相关性的,那到底怎么去使用 ...

  5. python获取模块的名称_Python获取模块名称

    每个模块都有一个名字,在模块中的语句能够找出它所在的模块的名字.这对于搞清楚模块是否正在运行或被导入这样的特殊用途是很方便的.正如前面提到的,当一个模块被第一次导入时,其所包含的代码被执行.我们可以通 ...

  6. python有哪些模块安全方向_Python 常用模块

    模块 用一坨代码实现了某个功能的代码集合 模块分为三种 · 自定义模块 · 第三方模块 · 内置模块 1)自定义模块 自己编写并存在在某个路径下的python程序,实现了某个功能,可以被其他程序调用 ...

  7. micropython常用模块有那个_Python常用模块,不明觉厉先马后看

    这是我在网上找的常用内置模块总结,不是大全.我想,大全对于现在的我也没有什么用处,徒增压力和烦恼. 虽然有很多不明觉厉的东西,不过还是先存起来,以备将来不时之需. 常用的libraries(modul ...

  8. python的pygame模块详解_python游戏模块学习之pygame常规操作讲解

    pygame常规操作 导入模块 import pygame # 导入pygame模块 from sys import exit # 导入退出鼠标点击事件 from math import pi # 导 ...

  9. python openpyxl模块追加数据_python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据...

    当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作 ...

  10. python ssh模块有哪些_Python paramiko模块(实现ssh)

    开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作 安装paramiko模块 pip3 install paramiko 基于用户密码方式 i ...

最新文章

  1. 旷视CEO竟遭监听敲诈:不给300万就卖敏感信息录音!网友:利好无人驾驶?
  2. 修改自动生成get/set方法模板代码
  3. python表白-python3实现表白神器
  4. MVVM中轻松实现Command绑定任意事件的Command
  5. 通过零知识证明,成为重要的区块链革新者
  6. 基础实验中的抗体选择过程和避坑Tips
  7. 比较两张大小相同的照片的差异,返回数值
  8. mysql32位的能装在64位的电脑上吗,mysql32位能装64位电脑【excle中怎么将log值变回原来的数据库】...
  9. Vue菜单栏边框参差不齐,修整完美
  10. 深度学习之江湖~那些大神们
  11. Step7 V5.6 win10版本安装包下载
  12. 移动硬盘使用时间、读写速度和坏道查询
  13. 群晖nas不能修改php.ini,群晖nas 修改nginx配置的问题
  14. 会声会影找不到MSVCP100.dll、MSVCR100.dll时怎么办?(其他软件也适合使用)
  15. java支付宝rsa2签名,使用支付宝SDK进行RSAj加签验签以及加密解密
  16. 【AI with ML】第 5 章 :自然语言处理简介
  17. java批量生成二维码图片,并打包成zip
  18. 把maven的setting配置文件改为需要jdk版本
  19. 蓝桥杯——单片机赛道
  20. Win8 Metro App里玩XNA:移植XNA游戏到Win8

热门文章

  1. Android水波纹特效的简单实现
  2. [转]Java NIO通俗易懂简明教程
  3. Xamarin.Android AlertDialog中的EditText打上去字为什么不显示?也没有光标闪烁
  4. HDU 2639 Bone Collector II (dp)
  5. sql 执行 delete 的时候,结合子查询 exists ,怎样支持别名呢?
  6. iOS开发编译错误:std::terminate(), referenced from:
  7. linux gpio-led
  8. mysql 设置 0、1 用什么数据类型_什么是MySQL数据库?看这一篇干货文章就够了!...
  9. C++之sizeof(vector)
  10. 自定义binder架构的 client/ server组件