在Python中,可以使用openpyxl模块处理Excel工作簿。由于openpyxl模块是第三方模块,所以需要安装此模块。安装openpyxl模块需要在Windows命令行窗口中输入的命令如下:
pip install openpyxl-i https://pypi.tuna.tsinghua.edu.cn/simple
然后,按Enter键,即可安装openpyxl模块,如图1—1所示。
图1—1 安装openpyxl模块
第三方模块openpyxl模块是采用面向对象的思想编写而成的。该模块可以创建3个层次的对象,最顶层的对象是工作簿(Workbook)对象,对应Excel工作簿;第2层的对象是工作表(Worksheet)对象,对应Excel工作表;第3层的对象是单元格(Cell)对象,对应Excel中的单元格。
在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]的方法获取工作表对象。
在openpyxl模块中,Workbook对象的常用方法和属性见表1—2。
表1—2 Workbook对象的常用方法和属性
在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的运行结果
在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-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写入的数据
【实例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写入的数据
在实际工作和生活中,可以利用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批量创建的工作表
在实际工作和生活中,需要将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运行后存储在工作表中的数据