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作为列名,按顺序将各字典中各值填写到各行中

posted @ 2022-07-24 23:41  lwjnicole  阅读(2401)  评论(0编辑  收藏  举报