Python笔记(十四):操作excel openpyxl模块
(一) 常遇到的情况
就我自己来说,常遇到的情况可能就下面几种:
- 读取excel整个sheet页的数据。
- 读取指定行、列的数据
- 往一个空白的excel文档写数据
- 往一个已经有数据的excel文档追加数据
下面就以这几种情况为例进行说明。
(二) 涉及的模块及函数说明
就我知道的,有3个模块可以操作excel文档,3个模块通过pip都可以直接安装。
xlrd:读数据
xlwt:写数据
openpyxl:可以读数据,也可以写数据
这里就就只说明openpyxl了,因为这个模块能满足上面的需要了。
openpyxl函数
函数 |
说明 |
load_workbook(filename) |
打开excel,并返回所有sheet页 访问指定sheet页的方法: #打开excel文档 #关闭excel文档 wb.close() |
Workbook() |
创建excel文档 wb = openpyxl.Workbook() #保存excel文档 wb.save('文件名.xlsx') |
下面的函数是针对sheet页的 sheet = wb[‘sheet页的名称’] 访问指定单元格的方式sheet['A1']、sheet['B1']... |
|
min_row |
返回包含数据的最小行索引,索引从1开始 例如:sheet.min_row |
max_row |
返回包含数据的最大行索引,索引从1开始 |
min_column |
返回包含数据的最小列索引,索引从1开始 |
max_column |
返回包含数据的最大列索引,索引从1开始 |
values |
获取excel文档所有的数据,返回的是一个generator对象 |
iter_rows(min_row=None, max_row=None, min_col=None, max_col=None)
|
min_row:最小行索引 max_row:最大行索引 min_col:最小列索引 max_col:最大列索引 获取指定行、列的单元格,没指定就是获取所有的 |
现在我有这么一个excel,下面以这个excel进行说明。
关于min_row、max_row这些,看下面的输出就很直观了
1 import openpyxl 2 3 def get_data_openpyxl(file_name,sheet): 4 #打开excel文档 5 wb = openpyxl.load_workbook(file_name) 6 #访问sheet页 7 sheet = wb[sheet] 8 # 包含数据的最小行索引,从1开始 9 minRow = sheet.min_row 10 print("最小行索引是:", minRow) 11 #包含数据的最大行索引,从1开始 12 maxRow = sheet.max_row 13 print("最大行索引是:",maxRow) 14 #包含数据的最小列索引 15 minColumn = sheet.min_column 16 print("最小列索引是:",minColumn) 17 #包含数据的最大列索引 18 maxColumn = sheet.max_column 19 print("最大列索引是:", maxColumn) 20 wb.close() 21 get_data_openpyxl('测试.xlsx','Sheet')
(三) 读取excel整个sheet页的数据
下面的代码都是没加异常处理的,要加的话自己看情况加上异常处理就行了。
1 import openpyxl 2 3 def get_data_openpyxl(file_name,sheet): 4 #打开excel文档 5 wb = openpyxl.load_workbook(file_name) 6 #访问sheet页 7 sheet = wb[sheet] 8 # 获取excel文档所有的数据,返回的是一个generator对象 9 data = sheet.values 10 print(data) 11 #迭代输出所有数据 12 for i in data: 13 print(i) 14 wb.close() 15 get_data_openpyxl('测试.xlsx','Sheet')
(四) 读取指定行、列的数据
这里有个问题就是,openpyxl模块貌似没有读取指定行、列数据的函数,不过没关系,自己封装一个函数去实现就行了,这个是通用的(前提是已经安装openpyxl),可以创建一个类(可以根据函数的作用创建多个不同的类,这个看自己了),放一些自己写的常用函数。
1 import openpyxl 2 3 def get_data_iter(file_name,sheet, max_row=None,min_row=None,max_col=None,min_col=None): 4 ''' 5 6 :param file_name: excel文件名称 7 :param sheet: sheet页名称 8 :param max_row:最大行索引,未指定则获取所有行的数据 9 :param min_row: 最小行索引,未指定则从第一行开始 10 :param min_col:最小列索引,未指定则从第一列开始 11 :param max_col:最大列索引,未指定则获取所有列的数据 12 :return:返回指定行、列的数据 13 ''' 14 # 打开excel文档 15 wb = openpyxl.load_workbook(file_name) 16 # 访问sheet页 17 sheet = wb[sheet] 18 # 获得指定行列的单元格 19 cell = sheet.iter_rows(max_row=max_row, min_row=min_row, max_col=max_col, min_col=min_col) 20 all_rows = [] 21 # 获取单元格的值 22 for row in cell: 23 rows = [] 24 for c in row: 25 rows.append(c.value) 26 all_rows.append(tuple(rows)) 27 wb.close() 28 return all_rows 29 30 rows = get_data_iter('测试.xlsx','Sheet',max_row=10,min_row=5,max_col=3,min_col=1) 31 print(rows) 32 for i in rows: 33 print(i)
(五) 往空白的excel文档写数据
1 import openpyxl 2 3 #创建excel文档 4 wb =openpyxl.Workbook() 5 sheet = wb['Sheet'] 6 sheet['A1'] = '颜色' 7 sheet['B1'] = '版本' 8 x = 2 9 for i in range(10): 10 sheet['A'+str(x)] = i+1 11 sheet['B'+str(x)] = i+1 12 x += 1 13 14 wb.save('测试写数据.xlsx')
执行后,可以在当前工作目录下看到这个excel文档
(六) 往一个已经有数据的excel文档追加数据
要追加数据的话,获取已经有数据的最大索引就行了,从下一行开始添加数据,这里X的初始值忘记加1了,代码就不修改了,能看明白就行了
1 import openpyxl 2 3 # 打开excel文档 4 wb = openpyxl.load_workbook('测试写数据.xlsx') 5 # 访问sheet页 6 sheet = wb['Sheet'] 7 #获取最大行索引 8 maxRow = sheet.max_row 9 x = maxRow 10 for i in range(10): 11 sheet['A'+str(x)] = '追加数据' 12 sheet['B'+str(x)] = '追加数据' 13 x += 1 14 15 wb.save('测试写数据.xlsx')
执行完后: