目录
一、一图概览
二、表格操作
三、内容操作
四、单元格操作
五、Pandas实现表格操作
六、常见场景示例
一、一图概览
本文主要对openpyxl库的常用表格操作进行了梳理,熟练的运用后可极大地提升工作效率。
二、表格操作
#创建一个表格sheet.xlsx
#使用openpyxl创建工作簿
wb=workbook.workbook.Workbook() #创建一个工作簿对象
wb.save("test.xlsx") #在py文件同级目录下创建一个空表
wb.save(r"C:\Users\ZYP_PC\Desktop\test_python\file\test2.xlsx") #在指定目录下创建表格sheet2.xlsx
#在表格中创建子表
wb.create_sheet(title="sheet_a") #创建子表sheet_a
wb.save("test.xlsx") #将子表保存到工作簿test.xlsx中
#从工作簿test.xlsx中删除子表sheet_b
wb=load_workbook("test.xlsx")
delete_sheet=wb["sheet_b"] #子表不存在会报文件不存在错误
wb.remove(delete_sheet)
wb.save("test.xlsx")
#修改test.xlsx中子表sheet_b的名称为sheet_a
wb=load_workbook("test.xlsx") #加载工作簿test.xlsx
sheet_names=wb.sheetnames #获取所有子表名称
old="sheet_b"
new="sheet_a"
ws=wb[old] #获取old的子表
ws.title=new #修改title属性值
wb.save("test.xlsx")
三、内容操作
#单元格内容遍历
wb=load_workbook("20240417.xlsx")
ws=wb.active
for row in ws.iter_rows(values_only=True): #按行优先遍历,没有内容的显示为None
for r in row:
print(r)
for col in ws.iter_cols(values_only=True): #按列优先遍历,没有内容的显示为None
for c in col:
print(c)
#读取指定位置A1的值
A1=ws["A1"].value
#读取指定行如第3行的内容
row=[]
for col in ws.iter_cols(values_only=True):
row.append(col[2]) #索引从0开始,因为第3行为索引值为2
print("row",row)
#读取指定列如第2列的内容
col=[]
for row in ws.iter_rows(values_only=True):
col.append(row[1]) #索引从0开始,因为第二列为1
print("col",col)
内容操作之内容写入
#在工作簿test.xlsx的工作表的sheet_b中的单元格C3写入你好
#方法1(以字母加数字的方式表示坐标)
wb=load_workbook("test.xlsx")
ws=wb["sheet_b"]
ws["A3"]="你好"
wb.save("test.xlsx") #保存修改,修改内容时表格不能打开,否则会提示无权限
#方法2(以行列数字序号表示)
wb=load_workbook("test.xlsx")
ws=wb["sheet_b"]
r=3
c=3
ws.cell(row=r,column=c,value="你好1")
wb.save("test.xlsx") #保存修改,修改内容时表格不能打开,否则会提示无权限
##逐行写入
wb=workbook.Workbook() #创建工作簿
ws=wb.active
ws.title="运行时间与内存" #设置默认表格名称sheet为指定的名称
ws=wb.create_sheet(title="运行时间与内存") #也可以另外创建子表
excel=r"C:\Users\ZYP_PC\Desktop\test_python\test2.xlsx"
start_row=3 #从指定行开始写入
ws.cell(row=start_row,column=1,value="工程名")
ws.cell(row=start_row,column=2,value="布局时间")
ws.cell(row=start_row,column=3,value="布线时间")
ws.cell(row=start_row,column=4,value="report_timing")
ws.cell(row=start_row,column=5,value="PR内存")
ws.append(("工程名1","布局时间","布线时间","report_timing时间","PR内存")) #各列的名称
data=[["prj1","1","22","23","34"],["prj2","11","22","23","34"],["prj3","111","22","23","34"]]
for row in data:
print("row ",row)
ws.append(row)
wb.save(excel)
四、单元格操作
from openpyxl import workbook
from openpyxl import load_workbook
from openpyxl.styles import Font,Alignment,Color,PatternFill
#打开指定表格进行单元格操作
excel=r"C:\Users\ZYP_PC\Desktop\test_python\test2.xlsx"
wb=load_workbook(excel)
ws=wb.active
ws=wb["测试子表"] #进行操作的子表
#插入2行
ws.insert_rows(4,2) #从第4行的位置插入2行
#插入3列
ws.insert_cols(3,1) #从第3列开始插入1列
#删除指定行
ws.delete_rows(10) #删除第10行
#删除指定列
ws.delete_cols(3) #删除第3列
#合并单元格
ws.merge_cells("A4:B4") #将A4和B4进行合并单元格操作
#取消合并单元格
ws.unmerge_cells("A4:B4") #取消将A4和B4进行合并单元格操作
#设置单元格格式
font=Font(name="Arial",size=12,bold=True,italic=False,color="FF0000",) #对单元格内容进行字体格式,大小,加粗,颜色当进行设置
ws["B3"].font=font
alignment=Alignment(horizontal="center",vertical="center") #对单元格内容进行对齐设置,例如此处为居中对齐
ws["A5"].alignment=alignment
fill=PatternFill(start_color="FFFF00",end_color="FFFF00",fill_type="solid") #对单元格设置背景颜色,此处为黄色
ws["A5"].fill=fill
wb.save(excel)
对于单元格格式的设置中,颜色与代码的映射关系可在下面网站进行查询
https://www.bchrt.com/tools/rgbcolor/
内容的对齐方式可选值有horizontal(水平对齐方式,包括 "general", "left", "center", "right", "fill", "justify", "centerContinuous","distributed")
vertical(垂直对齐方式,包括"top", "center", "bottom", "justify", "distributed")
textRotation(文字旋转),wrapText (自动换行),shrinkToFit(自动缩放到最佳位置),indent(缩进),relativelndent(相对缩进),justifyLastLine(最后一行对齐),reading Order(读顺序对齐)
五、Pandas实现表格操作
下面针对pandas库的一些常用表格查询操作进行了梳理
##使用pandas库处理表格,pandas对于数据的处理功能更强大,更适合对数据进行各种计算
import pandas as pd
path_excel=r"C:\Users\ZYP_PC\Desktop\test_python\pandas.xlsx" #工作簿路径
#方法1,以列表形式写入
# data = [('张三', 20, '男'),
# ('李四', 25, '女'),
# ('王五', 30, '男')]
#df = pd.DataFrame(data, columns=['姓名', '年龄', '性别'])
#方法2,以字典形式写入
data = {'姓名': ['张三', '李四', '王五'],
'年龄': [20, 25, 30],
'性别': ['男', '女', '男']}
df=pd.DataFrame(data) #pandas不支持直接创建工作簿,data数据可以是列表,字典
df.to_excel(path_excel,index=False) #创建表格pandas.xlsx,并将data数据写入
#数据查询
path_excel=r"C:\Users\ZYP_PC\Desktop\test_python\pandas1.xlsx"
data=pd.read_excel(path_excel) #读取表格
size=data.size #获取表格的数据个数
shape=data.shape #获取数据的行列数,不包含标题栏
#查看指定行和指定列的内容
print(data.loc[1:2,"年龄"]) #查找1到2行中列名为年龄的内容
# 查看前4行内容
print(data.head(4))
#查看后5行内容
print(data.tail(5))
#根据列名选择列
single_col=data["年龄"] #选中单列
multi_col=data[["年龄","性别"]] #选中多列
#选择行
single_row=data.iloc[0:1] #除去标题行后的内容进行筛选
print("row",single_row)
# print(data.size,data.shape)
for index,row in data.iterrows(): #按行逐条遍历
print("row:",row)
六、常见场景示例
示例1 遍历整个工作簿查找包含指定内动的单元格
from openpyxl import workbook
from openpyxl import load_workbook
excel=r"C:\Users\ZYP_PC\Desktop\test_python\测试表格.xlsx"
wb=load_workbook(excel)
ws=wb.active
search_value="搜索的内容"
site=[] #保存查找结果的单元格地址
sheet_list=[] #保存查找结果所在的子表名称
for sheet_name in wb.sheetnames:
sheet=wb[sheet_name]
for row in sheet.iter_rows():
for cell in row:
if cell.value==search_value:
site.append(cell.coordinate)
cell.value=""
sheet_list.append(sheet_name)
#示例2 在指定子表的指定范围内进行指定内容的查找,范围可指定行范围,列范围或区域范围
from openpyxl import workbook
from openpyxl import load_workbook
excel=r"C:\Users\ZYP_PC\Desktop\test_python\测试表格.xlsx"
wb=load_workbook(excel)
ws=wb.active
ws=wb["VCC"] #查找的子表名称为"VCC"
search_value="INPUT"
cells=ws["A3:C6"] #指定一个区域
# cells=ws["B:F"] #指定B到F列
# cells=ws[2:6] #指定第2到第6行
site=[]
for row in cells:
for cell in row:
if search_value in str(cell.value):
site.append(cell.coordinate)
print(site)