之前介绍了读和写excel,前两种都不是修改excel的,但是在实际的工作中,经常会遇到修改已经存在的Excel文件这种需求。xlrd中put_cell可以实现原表格上简单的写入,而xlwt直接生成新的表格,并不是在原表格的基础上进行修改。
通常方法逻辑就是:先打开这个excel,然后将内容读入到内存,进行处理,然后写到一个新的同名excel文件中,最后直接用修改后的excel文件覆盖了老的excel文件即可。
python已经帮我们实现了这么一个功能模块,那就是模块xlutils,这个模块依赖于xlrd和xlwt模块,它提供了复制excel文件内容和修改文件内容的功能。其实也就是在xlrd.Book和xlwt.Workbook之间建立了一个管道来实现修改功能。实现流程如下图所示:
xlutils方法:
- copy: 将xlrd.Book转为xlwt.Workbook
- styles: 读取xlrd.Workbook的每一个单元格的style
- display: 简单而安全地呈现xlrd读取的数据
- filter: 拆分与整合多个xls文件
- margins: 查看表格稀疏程度
- save: 序列化xlrd.Book,转存为binary xls或stream
1、引入模块,需要同时引入读模块和修改模块
In [1]: import xlrd
#从xlutils库导入copy函数
In [2]: from xlutils.copy import copy
2、打开excel开始将内容读到内存中
In [3]: readbook = xlrd.open_workbook('sample.xls')
3、使用xlutils.copy模块的copy()方法将原excel另外拷贝一份,准备修改操作;即将xlrd.Book转为xlwt.Workbook
#拷贝整个文件
In [4]: copybook = copy(readbook)
4、接下来就是从readBook中(也就是原excel中,注意这里读取数据的时候必须从原excel中读取)取得要修改的工作表,然后使用copybook取到相同工作表,使用进行修改操作,最后把修改的内容保存到读取到要修改的工作表
#通过sheet_by_index()获取的sheet没有write()方法,这个readsheet不能被copy后写入
In [5]:readSheet = readBook.sheet_by_index(0)
上面这种读sheet的方法是xlrd模块中的方法,它是没有write()方法,所以是不能写的。 然后将要修改整个excel文档拷贝一份:
In [6]: writesheet = copybook.get_sheet(0)
5、上面的通过get_sheet()获取的sheet是有write()方法,所以能写;接着进行写入操作
In [7]: writesheet.write(1,1,'love')
6、修改完数据以后,将新的excel表保存并覆盖旧的excel表即可,这就实现了对excel修改的操作需求。或者是另存为新Excel表格
In [8]: copybook.save('sample4.xls')
7、上述流程生成简要完整脚本文件:
import xlrd
from xlutils.copy import copy
readbook = xlrd.open_workbook('sample.xls')
copybook = copy(readbook)
writesheet = copybook.get_sheet(0)
writesheet.write(1,1,'love')
copybook.save('sample5.xls')