openpyxl 速成课 N1

本文介绍了如何使用Python库openpyxl进行基础的Excel操作,包括创建、保存工作簿,工作表,单元格赋值,读写Excel文件,以及处理工作表结构,如创建、删除工作表,定位单元格和使用offset方法。
摘要由CSDN通过智能技术生成

使用Python 处理 excel 速成课(openpyxl 实现)Note 1

本课时主要是一些 openpyxl 操作excel的基本操作,如 创建,保存excel 工作簿,工作表,切片单元格等。

# 导入所需要的包
import openpyxl
import datetime

print(openpyxl.__version__)
3.1.2

创建并保存 excel 文件

NB:一个 excel 文件我们称之为一个工作簿,每个工作簿里有多个工作表(sheet)

# 创建工作簿 
wb = openpyxl.Workbook() # 实例化一个工作簿 (调用 openpyxl 模块里的 Workbook 类,并实例化这个类)
ws = wb.active # 获取该工作簿里的工作表,默认创建的有一个工作表
ws.title # 获取该工作表的 title
'Sheet'
# 赋值数据
ws['A1'] = 520 # 向该工作表 A1 单元格赋值
ws.append([1,2,3]) # append 理论上从第一行开始按行添加,这里第一行A1已经有数据了,所以会从第二行开始添加。即依次添加 A2,B2,C2
ws['A3'] = datetime.datetime.now() # 赋值python的数据类型,这里我们赋值了 datatime 数据类型
wb.save('demo.xlsx')

结果如图:
N1Fig1

打开 excel 文件 (load_workbook 方法)

wb = openpyxl.load_workbook(r'C:\Users\rwq119\Desktop\CSDN_帖子\鱼C\excel\demo.xlsx') #在路径前面加r,即保持字符原始值的意思。不转义
type(wb)
openpyxl.workbook.workbook.Workbook

获取工作表

get_sheet_names() 方法

介绍:get_sheet_names() 方法,用来获取当前工作簿里所有工作表名称
NB:这个例子版本运行报警告 C:\Users\rwq119\AppData\Local\Temp\ipykernel_16572\1220563718.py:2: DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames). wb.get_sheet_names()。建议使用下面的 sheetnames 属性来获取当前工作簿里所有工作表名称

# 对于工作簿 wb, 调用工作簿的 get_sheet_names() 方法
# 抛出了警告 本版本
wb.get_sheet_names()
C:\Users\rwq119\AppData\Local\Temp\ipykernel_3724\663259850.py:3: DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
  wb.get_sheet_names()





['Sheet']

sheetnames 属性

介绍:sheetnames 属性,用来获取当前工作簿里所有工作表名称。

wb.sheetnames
['Sheet']

get_sheet_by_name 方法

介绍:用来找到指定名称对应的工作表
NB:这个例子版本运行报警告 :\Users\rwq119\AppData\Local\Temp\ipykernel_16572\573407989.py:1: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]). 建议用新方法

ws = wb.get_sheet_by_name('Sheet')
C:\Users\rwq119\AppData\Local\Temp\ipykernel_3724\573407989.py:1: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  ws = wb.get_sheet_by_name('Sheet')
# 新方法来获取指定名称对应的工作表
ws = wb['Sheet'] 

创建与删除工作表

create_sheet() 方法 创建工作表

介绍:create_sheet() 方法用来创建工作表。默认情况下新创建的工作表会在现有工作表后面,名字为Sheet1,Sheet2…
参数:
index: 指定工作表插入的位置,0表示第一个位置
title:指定工作表的名称

wb.create_sheet(index=0, title = 'demo1')
wb.sheetnames
['demo1', 'Sheet']

remove() 方法 or del 语句 删除工作表

介绍:wb.remove(worksheet) or del wb[sheetname]用来删除工作表
老版本:remove_sheet() 方法用来删除工作表。只有一个参数就是指定你要删除的工作表,但是注意该参数需要传入一个工作表的对象,而非一个工作表的名字

# wb.remove_sheet("demo1") 会报错,必须要传入工作表对象而非名字
print(wb.sheetnames)
wb.remove_sheet(wb['demo1'])
wb.sheetnames
#报警告:C:\Users\rwq119\AppData\Local\Temp\ipykernel_16572\2419292057.py:2: DeprecationWarning: Call to deprecated function remove_sheet (Use wb.remove(worksheet) or del wb[sheetname]). wb.remove_sheet(wb['demo1'])
['demo1', 'Sheet']


C:\Users\rwq119\AppData\Local\Temp\ipykernel_3724\2852702342.py:3: DeprecationWarning: Call to deprecated function remove_sheet (Use wb.remove(worksheet) or del wb[sheetname]).
  wb.remove_sheet(wb['demo1'])





['Sheet']
# wb.remove(wb['demo1'])
wb.create_sheet(index=0, title = 'demo1') # 同前文 先加一个表以供后面删除
print(wb.sheetnames)
wb.remove(wb['demo1'])
print(wb.sheetnames)
['demo1', 'Sheet']
['Sheet']
# del wb[sheetname]
wb.create_sheet(index=0, title = 'demo1') # 同前文 先加一个表以供后面删除
print(wb.sheetnames)
del wb['demo1']
print(wb.sheetnames)
['demo1', 'Sheet']
['Sheet']

定位单元格

描述:在获取工作表后可以类似 python 字典索引那样的方式定位单元格
NB:单元格对象拥有 row(行),column(列),coordinate(坐标)几个属性

ws = wb['Sheet'] # 获取一个工作表
c = ws['A2'] # 将A2单元格对象赋值给c
print(c.row)
print(c.column)
print(c.coordinate)
print(c.value) # 获取单元格的值
2
1
A2
1

offset() 方法

描述:定位距离某单元格,x行y列的另一个单元格

print(c) # 上面我们定义 c 是单元格A2对象
d = c.offset(1,1) # 向下偏移一行,向右1列
print(d)
print(d.value) # 获取该单元格值
<Cell 'Sheet'.A2>
<Cell 'Sheet'.B3>
None

AAA 是多少列

描述:在excel中,列是26进制来表示数据的,从第一列开始 A-Z,之后 AA-AZ

openpyxl.utils.cell.get_column_letter() 方法

描述:得到某列在excel中对应字母编号。比如:第496列对应的26进制字母编号

openpyxl.utils.cell.get_column_letter(496)
'SB'
openpyxl.utils.cell.column_index_from_string() 方法

描述:知道列的字母编号,求数字第几列

openpyxl.utils.cell.column_index_from_string('SB')
496

访问多个单元格

描述:openpyxl 允许将工作表对象进行切片操作,即通过切片的形式来表示一个范围内的多个单元格

打印某个区域内的单元格

for each in ws['A1':'C3']: # 从A1 到 C3 区域的单元格。此时each是每一行单元格组成的一个元组
    print(each)
    # print(each.value) 这行代码会报错,此时each是tuple。报错:'tuple' object has no attribute 'value'
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>)
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>)
(<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>)
# 打印出 A1 到 C3 每个单元格的值
# 先行后列的原则进行迭代。如同 append 先行后列加入
for each in ws['A1':'C3']:
    for each_cell in each:
        print(each_cell)
        print(each_cell.value)
<Cell 'Sheet'.A1>
520
<Cell 'Sheet'.B1>
None
<Cell 'Sheet'.C1>
None
<Cell 'Sheet'.A2>
1
<Cell 'Sheet'.B2>
2
<Cell 'Sheet'.C2>
3
<Cell 'Sheet'.A3>
2024-03-06 16:56:21.336000
<Cell 'Sheet'.B3>
None
<Cell 'Sheet'.C3>
None

获取当前工作表所有行列

# 通过 rows 和 columns 属性,直接获取当前工作表下所有行和列
## 以打每一行为列
for each_row in ws.rows:
    print(each_row)
print('\n')
## 只打每一行第一个元素。注意从0开始计
for each_row in ws.rows:
    print(each_row[0].value) # 只打第一列的元素
print('\n')  
## 只打每一行第二个元素。注意从0开始计
for each_row in ws.rows:
    print(each_row[1].value) # 只打第二列的元素
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>)
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>)
(<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>)


520
1
2024-03-06 16:56:21.336000


None
2
None

iter_rows()iter_columns 方法

for each_row in ws.iter_rows(min_row=1, min_col=1, max_row=3, max_col=3): #注意这里行数和列数从1开始计数。我试了一下如果指定0也是第一行or第一列
    print(each_row)
    print(each_row[0].value)

print('\n')

# 这里做了个实验。0也代表第一行第一列
for each_row in ws.iter_rows(min_row=0, min_col=0, max_row=3, max_col=3):
    print(each_row)
    print(each_row[0].value)
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>)
520
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>)
1
(<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>)
2024-03-06 16:56:21.336000


(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>)
520
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>)
1
(<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>)
2024-03-06 16:56:21.336000

拷贝工作表 copy_worksheet() 方法

描述:在工作簿中拷贝一个工作表

new = wb.copy_worksheet(ws) #拷贝 ws 工作表在wb中
print(type(new))
wb.save('demo.xlsx')
<class 'openpyxl.worksheet.worksheet.Worksheet'>

结果如图:
N1Fig2




附言:
本文为自学B站上鱼C的python课程(【办公篇】《极客Python之效率革命》P1-P2)随手做的笔记。一些概念和例子我个人为更好的理解做了些查询和补充
因本人水平有限,如有任何问题,欢迎大家批评指正!
原视频链接:https://www.bilibili.com/video/BV1wp411o71g?p=2&vd_source=6999af1d1ba811ac01f8eed2325bee07

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值