openpyxl操作excel
一、概要介绍
openpyxl是一个第三方库,可以处理xlsx格式的excel文件。openpyxl可以读写excel,专门处理xlsx格式的excel文件。与xlrt、xlwt库不同,xlrt只能对excel进行读操作,xlwt只能对excel进行写操作,而openpyxl集读写excel于一身,非常简单方便。不过openpyxl只能处理xlsx格式的excel文件,如果遇到版本旧点的xls格式的excel则处理不了,这时候可以选择使用xlrt和xlwt库来处理。
二、基本概念
openpyxl库有三大模块组成,分别为:Workbook、Sheet、Cell
Workbook:工作簿,一个excel文件包含一个工作簿(Workbook)
Worksheet:工作表,一个工作簿(Workboot)包含多个工作表(Worksheet),由多个单元格组成
Cell:单元格,一个工作表(Worksheet)包含多个单元格(Cell),单元格只存储两种数据类型:数字和字符串,除了纯数字之外,其余的都为字符串
三、openpyxl安装
pip install openpyxl
四、基本操作
openpyxl三大属性:
1、Workbook属性:
sheetnames:返回所有Worksheet的名字列表,以list形式返回;
worksheets:返回所有Worksheet的列表,以list形式返回;
active:返回当前激活选中的工作表(Worksheet);
2、Worksheet属性
3、Cell属性
常用操作:
1、加载excel文件:
先从openpyxl库中导入load_workbook方法:
from openpyxl import load_workbook
然后使用load_workbook方法加载excel文件:
workbook = load_workbook(filename='data.xlsx') # data.xlsx文件放在当前包下,也可以写excel文件的绝对路径
2、获取工作表对象:
sheet = workbook['Sheet1'] # 通过指定工作表名称来获取工作表 sheet = workbook.worksheets[sheet_num] # 也可以通过工作表下标来获取,这里sheet_num表示第几个sheet,从0开始
3、获取单元格对象以及单元格对象对应的值:
# 获取单元格对象 cell = sheet["A1"] 或者 cell = sheet.cell(2,2) # excel中的下标从1开始 # 获取单元格对象对应的值 cell_value = cell.value # 修改单元格的数据 cell.value = '新的值'
4、获取当前表单的最大行和最大列:
max_row = sheet.max_row # 获取最大行 max_col = sheet.max_column # 获取最大列
5、行操作与列操作:
# 行操作 res1 = sheet.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False) # 列操作 res2 = sheet.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False) # 以上行操作和列操作最后输出是一个生成器,需要转换为list使用,例如list(res1)、list(res2)
行操作、列操作参数说明:
min_row=None,起始行索引值,索引从1开始,int类型,默认为1;
max_row=None,结束行索引值,索引从1开始,int类型,默认为最大行的值;
min_col=None,起始列索引值,索引从1开始,int类型,默认为1;
max_col=None,结束列索引值,索引从1开始,int类型,默认为最大列的值;
values_only=False,默认为False,为False时返回对象,为True时,返回单元格对应的数据;
五、案例
1、openpyxl读取excel,以字典列表形式输出结果:
def get_excel_list(sheet_num=0): case_list = [] workbook = load_workbook(filename="data.xlsx") sheet_obj = workbook.worksheets[sheet_num] # 因为原始数据excel中有很多None列,所以在这里去掉为None的列,获取有效列的长度,后面就取“有效列长度”的数据 col_len = len(list(filter(None, list(sheet_obj.iter_rows(min_row=1, max_row=1, values_only=True))[0]))) cases = list(sheet_obj.iter_rows(max_col=col_len, values_only=True)) workbook.close() # 把表头取出来 case_title = cases[0] # 把表里数据取出来 case_text = cases[1:] for case in case_text: result = dict(zip(case_title, case)) case_list.append(result) return case_list if __name__ == '__main__': case_list = get_excel_list() print(case_list)
2、openpyxl将字典列表形式的数据写入excel中:
""" input_data:要写入的数据,格式为: [{key1:value1,key2:value2,key3:value3…}…] output_data:生成的文件名称 """ def export_excel(input_data, output_data): workbook = Workbook() sheet = workbook.active fd = input_data[0] char_list = [chr(letter).upper() for letter in range(65, 91)] + [chr(65).upper() + chr(letter).upper() for letter in range(65, 91)] key_index_list = range(len(list(fd.keys()))) for zm, i in list(zip(char_list, key_index_list)): sheet[zm + str(1)].value = list(fd.keys())[i] j = 2 for item in input_data: for zm, key in list(zip(char_list, list(fd.keys()))): sheet[zm + str(j)] = item[key] j += 1 workbook.save(output_data) if __name == '__main__': input_data = [{'a':1},{'b':2},{'c':3}] output_data = '结果.xlsx' export_excel(input_data, output_data)
不需要提前写入列名,默认把字典的各个key作为列名,按顺序将各字典中各值填写到各行中