![编程改变生活:用Python提升你的能力(进阶篇·微课视频版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/968/52841968/b_52841968.jpg)
1.2 openpyxl模块
在Python中,可以使用openpyxl模块处理Excel工作簿。由于openpyxl模块是第三方模块,所以需要安装此模块。安装openpyxl模块需要在Windows命令行窗口中输入的命令如下:
pip install openpyxl-i https://pypi.tuna.tsinghua.edu.cn/simple
然后,按Enter键,即可安装openpyxl模块,如图1-1所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P16_1923.jpg?sign=1739253181-x5abHh673ZTYVtoQY5jKZBHtpdUjL1Je-0-a3d76f099356e1a4c1c2e35696b7aa02)
图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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P17_1950.jpg?sign=1739253181-9hY2Ei8hOvlZK1u12VzT0mOxwqtuvUlU-0-ddd585acbed3e6c0d9b46737ce30b798)
图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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P17_1962.jpg?sign=1739253181-CnfR3kmzCYXSwMKKFtLVM8jcSAjr1uEB-0-1fd662b9e3d6197ffe8f02d900038c4d)
图1-3 代码1-1.py的运行结果
注意:从图1-3可以得知,工作簿对象的get_sheet_by_name()方法将被放弃,建议使用workbook[sheetname]的方法获取工作表对象。
2.工作簿(Workbook)对象的属性和方法
在openpyxl模块中,Workbook对象的常用方法和属性见表1-2。
表1-2 Workbook对象的常用方法和属性
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-T18_19885.jpg?sign=1739253181-hQkObCw52a86WFtxkaciJxUnCzmTbK54-0-b474c61bbf2f206d085f701ff639e5b7)
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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P19_2063.jpg?sign=1739253181-s1XCtQUSiDj1P0lZUlBkOURVT9qdHBoG-0-8caf9cb4af5a49bc5f5539545c0aa62a)
图1-4 代码1-2.py的运行结果
4.工作表(Worksheet)对象和单元格(Cell)对象的属性和方法
在openpyxl模块中,Worksheet对象的常用方法和属性见表1-3。
表1-3 Worksheet对象的常用方法和属性
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-T19_19886.jpg?sign=1739253181-RRsrNhFCdlU9XeBAOabYytEMSbEFIKOr-0-afb0032644d0e9f9e2f9f73a2a5c7034)
在openpyxl模块中,Cell对象的常用属性见表1-4。
表1-4 Cell对象的常用属性
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-T20_19887.jpg?sign=1739253181-D2SYo95oru7vuJTivFAYwCLSS9fMbuRD-0-4720a2a5cd0899bd5d98e0d08c844d3c)
【实例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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P20_2199.jpg?sign=1739253181-ClvEtVytqtcw6cVwoAermU9MidyBVdBl-0-b74b66ac3dacc763f7a35dfd91d3255c)
图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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P21_2215.jpg?sign=1739253181-PHSfxBmCHNgeKLLfsp5KEEQr0z4vtwrh-0-360d04a4aa3c8ea1961441ac0202fe1a)
图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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P22_2230.jpg?sign=1739253181-h2TRP6kgKzMKQAgbEsIk7iyJDyvIsuy7-0-02f5a69930997be7a601aa283bd29005)
图1-7 代码1-5.py写入的数据
1.2.3 批量生成Excel工作表
在实际工作和生活中,可以利用openpyxl模块和Excel模板批量创建Excel工作表。
【实例1-6】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx),如图1-8所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P22_2235.jpg?sign=1739253181-DS50R9E53QwSEbiDkorB4cqS81hqiORt-0-cd234f17712925d70130c14821a9a60f)
图1-8 销售数据.xlsx
现在需要根据出货日期分类整理成多个出货清单,使用的模板存放在Excel工作簿(出货清单.xlsx)中,如图1-9所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P22_2239.jpg?sign=1739253181-TfUGNAWJBAMeaiiSCr6M6Eh6QXURoKo9-0-aa566f8d604853edd43f5b74a3e1a49c)
图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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P23_2255.jpg?sign=1739253181-Om6pB4t9tEbp1bmh34sB8L7iULvCf5Ih-0-c31e0ff1b52d6cee582e4987f53df65f)
图1-10 代码1-6.py的运行结果
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P24_2260.jpg?sign=1739253181-FfKek9gyakSbrbp9fxZgJdbc7uFUzKUZ-0-f81343672f524dbdc26301f4e63ea146)
图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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P24_2265.jpg?sign=1739253181-hwZajgdQuqVwwUxmGK3Y0KCBbxbgxWAl-0-5f9f08cae9b90e577c46c8205f3d9c0e)
图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所示。
![](https://epubservercos.yuewen.com/D90D69/31397697307936406/epubprivate/OEBPS/Images/Figure-P25_2280.jpg?sign=1739253181-WIax1733lSbwX3j6Am2WzSZ28pJc1al0-0-0b4d39df04e9b60cfeb2dc0036673e31)
图1-13 代码1-7.py运行后存储在工作表中的数据