购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 openpyxl模块

在Python中,可以使用openpyxl模块处理Excel工作簿。由于openpyxl模块是第三方模块,所以需要安装此模块。安装openpyxl模块需要在Windows命令行窗口中输入的命令如下:

    pip install openpyxl-i https://pypi.tuna.tsinghua.edu.cn/simple

然后,按Enter键,即可安装openpyxl模块,如图1—1所示。

图1—1 安装openpyxl模块

1.2.1 读取Excel工作簿

第三方模块openpyxl模块是采用面向对象的思想编写而成的。该模块可以创建3个层次的对象,最顶层的对象是工作簿(Workbook)对象,对应Excel工作簿;第2层的对象是工作表(Worksheet)对象,对应Excel工作表;第3层的对象是单元格(Cell)对象,对应Excel中的单元格。

1.创建工作簿(Workbook)对象和工作表(Worksheet)对象

在openpyxl模块中,可以通过函数openpyxl.load_workbook()打开一个Excel文档并返回一个工作簿(Workbook)对象。调用Workbook对象中的方法get_sheet_by_name()就可以创建工作表(Worksheet)的对象,其语法格式如下:

    import openpyxl
    workbook1=openpyxl.load_workbook(path)
    sheet1=workbook1.get_sheet_by_name(sheet_name)

其中,path表示Excel文档的路径;sheet_name表示Excel中工作表的名字。另外也可以通过访问Workbook列表的方式创建工作表对象,其语法格式如下:

    import openpyxl
    workbook1=openpyxl.load_workbook(path)
    sheet1=workbook1[sheet_name]

【实例1-1】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx),如图1—2所示。

图1—2 销售数据.xlsx

使用openpyxl模块中的两种方法获取工作表对象,并打印工作表对象,代码如下:

    #===第1章代码1-1.py===#
    from openpyxl import load_workbook
 
    workbook=load_workbook('D:\\test\\销售数据.xlsx')
    worksheet1=workbook['Sheet1']
    print(worksheet1)
    worksheet2=workbook.get_sheet_by_name('Sheet1')
    print(worksheet2)

运行结果如图1—3所示。

图1—3 代码1-1.py的运行结果

注意: 从图1—3可以得知,工作簿对象的get_sheet_by_name()方法将被放弃,建议使用workbook[sheetname]的方法获取工作表对象。

2.工作簿(Workbook)对象的属性和方法

在openpyxl模块中,Workbook对象的常用方法和属性见表1—2。

表1—2 Workbook对象的常用方法和属性

3.通过工作表(Worksheet)对象获取单元格(Cell)对象

在openpyxl模块中,通过Workbook对象的方法获得Worksheet对象。通过Worksheet对象的方法就可以获得单元格的数据。从图1—2可以得出,每个工作表中列的地址是大写的英文字母A、B、C、D、E…,每个工作表中行的地址是数字1、2、3、4、5…,所以可以通过Worksheet['A1']的方式获取工作表中第1行第1列单元格对象,或者通过Worksheet['C5']的方式获取工作表中第5行第3列的单元格对象,然后通过单元格对象的value属性读取单元格数据,通过单元格对象的coordinate属性获得单元格的坐标或地址。

单元格对象也称为Cell对象。Worksheet对象可以通过切片的方式获得某个范围中所有的Cell对象,例如WorkSheet[A1:D4]。

【实例1-2】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx),如图1—2所示。使用openpyxl模块中的方法获得第1行第1列Cell对象,第2行第3列Cell对象,并读取Cell对象的数据。使用切片的方式从Worksheet对象获取从第1行第1列到第5行第5列区域中的Cell对象,并遍历该从第1行第1列到第4行第3列单元格的坐标和数据,代码如下:

    #===第1章代码1-2.py===#
    from openpyxl import load_workbook
 
    wkbook=load_workbook('D:\\test\\销售数据.xlsx')
    wsheet=wkbook['Sheet1']
    print(wsheet['A1'])
    print(wsheet['C2'])
    print(wsheet['A1'].value)
    print(wsheet['C2'].value)
    print(wsheet['A1':'E5'])
    for row_obj in wsheet['A1':'C4']:
         for cell_obj in row_obj:
                 print(cell_obj.coordinate,cell_obj.value)

运行结果如图1—4所示。

图1—4 代码1-2.py的运行结果

4.工作表(Worksheet)对象和单元格(Cell)对象的属性和方法

在openpyxl模块中,Worksheet对象的常用方法和属性见表1—3。

表1—3 Worksheet对象的常用方法和属性

在openpyxl模块中,Cell对象的常用属性见表1—4。

表1—4 Cell对象的常用属性

【实例1-3】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx),如图1—2所示。使用openpyxl模块中的两种方法遍历工作表Sheet1中的数据,代码如下:

    #===第1章代码1-3.py===#
    from openpyxl import load_workbook
 
    workbook=load_workbook('D:\\test\\销售数据.xlsx')
    worksheet=workbook['Sheet1']
    #第1种方法
    for row in range(1,worksheet.max_row+1):
         date1=str(worksheet['A'+str(row)].value)
         date1=date1[0:-9]
         customer=worksheet['B'+str(row)].value
        produce=worksheet['C'+str(row)].value
        number=worksheet['D'+str(row)].value
        unit=worksheet['E'+str(row)].value
        print(date1,customer,produce,number,unit)
    #第2种方法
    row_list=list(worksheet.values)
    for row in row_list:
        print(row)

运行结果如图1—5所示。

图1—5 代码1-3.py的运行结果

1.2.2 写入Excel工作簿

1.通过单元格(Cell)对象的属性写入数据

【实例1-4】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx),如图1—2所示。使用openpyxl模块中Cell对象的属性写入一组数据,代码如下:

    #===第1章代码1-4.py===#
    from openpyxl import load_workbook
 
    workbook=load_workbook('D:\\test\\销售数据.xlsx')
    worksheet=workbook['Sheet1']
    worksheet.cell(row=8,column=1).value='2022/9/29'
    worksheet.cell(row=8,column=2).value='曹操'
    worksheet.cell(row=8,column=3).value='手术机器人'
    worksheet.cell(row=8,column=4).value='1'
    worksheet.cell(row=8,column=5).value='台'
    workbook.save('D:\\test\\销售数据.xlsx')

运行结果如图1—6所示。

图1—6 代码1-4.py写入的数据

2.通过工作表(Worksheet)对象的方法写入数据

【实例1-5】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx),如图1—6所示。使用openpyxl模块中的Worksheet对象的属性写入两组数据,代码如下:

    #===第1章代码1-5.py===#
    from openpyxl import load_workbook
 
    workbook=load_workbook('D:\\test\\销售数据.xlsx')
    worksheet=workbook['Sheet1']
    data1_list=['2022/9/29','华佗','核磁共振仪','1','台']
    data2_list=['2022/9/19','刘备','无人飞行器','10','台']
    worksheet.append(data1_list)
    worksheet.append(data2_list)
    workbook.save('D:\\test\\销售数据.xlsx')

运行结果如图1—7所示。

图1—7 代码1-5.py写入的数据

1.2.3 批量生成Excel工作表

在实际工作和生活中,可以利用openpyxl模块和Excel模板批量创建Excel工作表。

【实例1-6】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx),如图1—8所示。

图1—8 销售数据.xlsx

现在需要根据出货日期分类整理成多个出货清单,使用的模板存放在Excel工作簿(出货清单.xlsx)中,如图1—9所示。

图1—9 出货清单模板

使用openpyxl模块在出货清单.xlsx文件中批量创建Excel工作表,即批量创建出货清单工作表,代码如下:

    #===第1章代码1-6.py===#
    from openpyxl import load_workbook
 
    workbook=load_workbook('D:\\test\\销售数据.xlsx')
    worksheet=workbook['Sheet1']
    data={}
    for row in range(2,worksheet.max_row+1):
        date1=str(worksheet['A'+str(row)].value)
        date1=date1[0:-9]
        data.setdefault(date1,[])
        customer=worksheet['B'+str(row)].value
        produce=worksheet['C'+str(row)].value
        number=worksheet['D'+str(row)].value
        unit=worksheet['E'+str(row)].value
        info_list=[customer,produce,number,unit]
        data[date1].append(info_list)
 
    for key,value in data.items():
        print(key,value)
 
    wk_day=load_workbook('D:\\test\\出货清单.xlsx')
    ws_day=wk_day['出货清单模板']
    #遍历字典data中的键
    for date in data.keys():
        ws_new=wk_day.copy_worksheet(ws_day)
        ws_new.title=str(date)[-5:]
        ws_new.cell(row=2,column=4).value=date
        i=4#从第4行开始逐行填写出货记录
        for product in data[date]:
                 ws_new.cell(row=i,column=1).value=product[0]
                 ws_new.cell(row=i,column=2).value=product[1]
                 ws_new.cell(row=i,column=3).value=product[2]
                 ws_new.cell(row=i,column=4).value=product[3]
                 i=i+1
 
    wk_day.save('D:\\test\\出货清单.xlsx')

运行结果如图1—10和图1—11所示。

图1—10 代码1-6.py的运行结果

图1—11 代码1-6.py批量创建的工作表

1.2.4 提取PDF表格存储在Excel工作表中

在实际工作和生活中,需要将PDF文档中表格数据提取出来,并存储在Excel工作表中。运用《编程改变生活——用Python提升你的能力(基础篇·微课视频版)》第16章讲解的pdfplumber模块可以提取PDF文档中的表格,然后通过openpyxl模块存储在Excel工作表中。

【实例1-7】 在D盘test文件夹下有一个PDF文档(2021年报.pdf)和一个空Excel文档(pdf_excel.xlsx),PDF文档的第76页是资产负债表的一部分,如图1—12所示。

图1—12 PDF文档中的表格数据

提取PDF文档中第76页表格数据,并存储在Excel文档(pdf_excel.xlsx)的工作表中,代码如下:

    #===第1章代码1-7.py===#
    import pdfplumber
    import os
    from openpyxl import load_workbook
 
    wb=load_workbook('D:\\test\\pdf_excel.xlsx')
    ws=wb['Sheet1']#获取第1个Sheet
    os.chdir('D:\\test\\')
    with pdfplumber.open('2021年报.pdf')as pdf:
       page=pdf.pages[75]#设置操作页面
       for rows in page.extract_tables():
          for row in rows:
                ws.append(row)
       wb.save('pdf_excel.xlsx')

运行结果如图1—13所示。

图1—13 代码1-7.py运行后存储在工作表中的数据 K8URzfKHLSu09xKVs3CAsw4Wk8X5w8oU64av/9H6/UnDYIBeoGXv8FKORsiZIykI

点击中间区域
呼出菜单
上一章
目录
下一章
×