Crossin的编程教室

标题: Python-Excel 模块哪家强? [打印本页]

作者: 江水滔滔    时间: 2018-7-3 01:22
标题: Python-Excel 模块哪家强?
0. 前言
从网页爬下来的大量数据需要清洗?

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

有成堆的表格等待统计?

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



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

xlwings


提醒及注意:
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基本代码
  1. import xlwings as xw
  2. #连接到excel
  3. workbook = xw.Book(r'path/myexcel.xlsx')#连接excel文件
  4. #连接到指定单元格
  5. data_range = workbook.sheets('Sheet1').range('A1')
  6. #写入数据
  7. data_range.value = [1,2,3]
  8. #保存
  9. workbook.save()
复制代码
6.2 xlsxwriter基本代码
  1. import xlsxwriter as xw
  2. #新建excel
  3. workbook  = xw.Workbook('myexcel.xlsx')
  4. #新建工作薄
  5. worksheet = workbook.add_worksheet()
  6. #写入数据
  7. worksheet.wirte('A1',1)
  8. #关闭保存
  9. workbook.close()
复制代码
6.3 xlutils基本代码import xlrd #读取数据
  1. import xlwt #写入数据
  2. import xlutils #操作excel
  3. #----xlrd库
  4. #打开excel文件
  5. workbook = xlrd.open_workbook('myexcel.xls')
  6. #获取表单
  7. worksheet = workbook.sheet_by_index(0)
  8. #读取数据
  9. data = worksheet.cell_value(0,0)
  10. #----xlwt库
  11. #新建excel
  12. wb = xlwt.Workbook()
  13. #添加工作薄
  14. sh = wb.add_sheet('Sheet1')
  15. #写入数据
  16. sh.write(0,0,'data')
  17. #保存文件
  18. wb.save('myexcel.xls')
  19. #----xlutils库
  20. #打开excel文件
  21. book = xlrd.open_workbook('myexcel.xls')
  22. #复制一份
  23. new_book = xlutils.copy(book)
  24. #拿到工作薄
  25. worksheet = new_book.getsheet(0)
  26. #写入数据
  27. worksheet.write(0,0,'new data')
  28. #保存
  29. new_book.save()
复制代码
6.4 win32com基本代码
  1. import win32com.client as wc
  2. #启动Excel应用
  3. excel_app = wc.Dispatch('Excel.Application')
  4. #连接excel
  5. workbook = excel_app.Workbooks.Open(r'e:/myexcel.xlsx' )
  6. #写入数据
  7. workbook.Worksheets('Sheet1').Cells(1,1).Value = 'data'
  8. #关闭并保存
  9. workbook.SaveAs('newexcel.xlsx')
  10. excel_app.Application.Quit()
复制代码
6.5 openpyxl基本代码  
  1. import openpyxl
  2. # 新建文件
  3. workbook = openpyxl.Workbook()
  4. # 写入文件
  5. sheet = workbook.activesheet['A1']='data'
  6. # 保存文件
  7. workbook.save('test.xlsx')
复制代码
6.6 DataNitro基本代码
  1. #单一单元格赋值
  2. Cell('A1').value = 'data'
  3. #单元区域赋值
  4. CellRange('A1:B2').value = 'data'
复制代码




其他文章及回答:











欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5