之前介绍了读和写excel,前两种都不是修改excel的,但是在实际的工作中,经常会遇到修改已经存在的Excel文件这种需求。xlrd中put_cell可以实现原表格上简单的写入,而xlwt直接生成新的表格,并不是在原表格的基础上进行修改。

通常方法逻辑就是:先打开这个excel,然后将内容读入到内存,进行处理,然后写到一个新的同名excel文件中,最后直接用修改后的excel文件覆盖了老的excel文件即可。

python已经帮我们实现了这么一个功能模块,那就是模块xlutils,这个模块依赖于xlrd和xlwt模块,它提供了复制excel文件内容和修改文件内容的功能。其实也就是在xlrd.Book和xlwt.Workbook之间建立了一个管道来实现修改功能。实现流程如下图所示:

XWPFTemplate 修改表格内容 xlwt修改现有excel_Excel修修改改操作

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')