Python中使用OpenpyXL操作Excel

一、安装openpyxl库

可以使用命令

pip install openpyxl

指定版本与切换国内源请查看pyMySQL库那那一文章的详细解答

Python中使用PyMySQL库连接MySQL数据库 - AiniIT琦玉 - 博客园 (cnblogs.com)

二、读取Excel

1、读取全部

读取excel写法逻辑如下:

读取
# 调用函数,传递文件名
# 获取需要读取的单元表
# 读数据
# 关闭文件

实例:

import openpyxl
#	引用openpyxl

#获取表对象
r = openpyxl.load_workbook('test.xlsx')
#获取当前表的sheet
r_table = r.active
#创建空列表
data_list = []

for x in r_table.values:    # 读取所有的数据以元祖类型返回
    # 将每个遍历出来的值添加到空列表中
    data_list.append(x)
    
# 输出列表中的值
print(data_list)
# 关闭连接
r.close()

我们在获取表的sheet的时候,active只获取在退出表格时点击保存过后的sheet界面,如果想获取sheet,我们可以使用worksheets、sheetnames、和直接指定sheet名称等多种方式,下面开始演示

使用直接引用sheet名称

import openpyxl

#	引用openpyxl

# 获取表对象
r = openpyxl.load_workbook('test.xlsx')
# 获取当前表的sheet
r_table = r['Sheet1']  # 注意这里直接引用了sheet的名称
# 创建空列表
data_list = []

for x in r_table.values:  # 读取所有的数据以元祖类型返回
    # 将每个遍历出来的值添加到空列表中
    data_list.append(x)

# 输出列表中的值
print(data_list)
# 关闭连接
r.close()

image-20231201124807565

使用worksheets方法:

import openpyxl

#	引用openpyxl

# 获取表对象
r = openpyxl.load_workbook('test.xlsx')
# 获取当前表的sheet
r_table = r.worksheets[0]  # 注意这里是用切片方法来选择sheet表格的位置
# 创建空列表
data_list = []

for x in r_table.values:  # 读取所有的数据以元祖类型返回
    # 将每个遍历出来的值添加到空列表中
    data_list.append(x)

# 输出列表中的值
print(data_list)
# 关闭连接
r.close()

#	输出结果为
[('1', '2', '3', '4', '5', '6'), ('7', '8', '9', '0', '11', '12')]

使用sheetnames方法:

这种方法就是通过列表对象直接选择sheet表格一样,只不过通过sheetnames将sheet名称获取到了而已

import openpyxl

#	引用openpyxl

# 获取表对象
r = openpyxl.load_workbook('test.xlsx')
# 获取当前表的sheet
r_table = r[r.sheetnames[0]]
print(r.sheetnames[0])
# 创建空列表
data_list = []

for x in r_table.values:  # 读取所有的数据以元祖类型返回
    # 将每个遍历出来的值添加到空列表中
    data_list.append(x)

# 输出列表中的值
print(data_list)
# 关闭连接
r.close()

#	输出结果为
Sheet1
[('1', '2', '3', '4', '5', '6'), ('7', '8', '9', '0', '11', '12')]

2、按照指定的范围读取

我们需要先设置指定的行和列

实例

import openpyxl


# 根据传递的行和列进行读取
r = openpyxl.load_workbook('test.xlsx')
# 默认是获取关闭保存时所在的excel中的单元表
r_table = r.active
# d_table = r['单元表名称']  # 读取指定的单元表

# 设置外层空列表
data_list = []
# 读取1-2行,第2-第5列的值
# r_table.max_row代表最大行数,但是range方法用的是左闭右开的方式取值,所以要在后面加一,才能读取到最后一行的值
for x in range(1, r_table.max_row+1):     # x代表行数
    # 设置内层空列表
    tmp = []
    # r_table.max_column代表最大列数,但是range方法用的是左闭右开的方式取值,所以要在后面加一,才能读取到最后一列的值
    for y in range(1, r_table.max_column+1):  # y代表列数
        # 将获取到的值添加到内层空列表tmp中
        tmp.append(r_table.cell(x, y).value)
    # 将每一次获取到的值添加到外层列表的data_list中
    data_list.append(tmp)
    
print(data_list)
r.close()

三、写入Excel

写入时,我们也需要引用openpyxl库

写入逻辑如下:

# 写入

# 初始化类,创建单元表格
# 获取单元表
# 写入数据
# 保存

实例

import openpyxl

# 创建一个新的工作簿对象
wb = openpyxl.Workbook()

# 获取工作表对象(sheet)
ws = wb.active
print(ws)

# 设置Sheet名称
ws.title = '学生表'

# 创建一个新sheet,可以指定名称,index表示新创建的工作簿放在第几个位置, index从0开始计数
ws_1 = wb.create_sheet(index=1, title='成绩表')
ws_2 = wb.create_sheet(index=2, title='科目表')

# 获取所有工作表名称
print(wb.sheetnames)

# 方法一:写入单个单元格
ws['A1'] = '姓名'
ws['B1'] = '班级'
ws['c1'] = '年龄'

# 方法二:写入单个单元格(行,列,内容); 也可以直接ws.cell(1, 4, '学校')
ws.cell(row=1, column=4, value='学校')

# 写入多个单元格(追加模式,不会覆盖之前的,从有数据的下一行开始)
ws.append(['王明', '三年级一班', '9岁'])

# 第一列和第三列插入数据,第二列插入[None]值
ws.append(['王五', None, '10岁'])

# 追加第二行数据,过滤空值
# 获取工作表总行数
max_row = ws.max_row
col_values = []
# 遍历第二列所有行
for row in range(1, max_row+1):
    # 获取当前单元格的值
    cell_value = ws.cell(row=row, column=2).value
    # 如果当前单元格的值不为空
    if cell_value is not None:
        # 将当前单元格的值添加到列表中
        col_values.append(cell_value)
print("第二列有 %d 行数据" % len(col_values))
ws.cell(len(col_values)+1, 2, "三年级二班")

# 将新数据追加到最后一行,忽略第二列
data = [['张三', '10岁'], ['李四', '15岁']]
for row in data:
    # 在第二列插入 None 值,实现跳过该列
    row.insert(1, None)
    ws.append(row)

# 保存
wb.save('1.xlsx')

在这里插入图片描述

我们在实际操作时,基本上使用的比较多的就是批量多行写入数据

实例

import openpyxl

# 创建表对象
w = openpyxl.Workbook()
# 获取工作对象sheet
x_table = w.active
# 写入单行单列(每一个列个上写数据)
# x_table.append(['a', 'b', 'c', 'd', 'e'])
# 写入多行多列,需要嵌套列表类型,使用循环方式写入
data_list = [
    ['1','2','3','4','5','6'], 
    ['7','8','9','0','11','12']
]
# 遍历写入数据列表
for x in data_list:
    # 将遍历好的数据依次写入工作对象sheet中
    x_table.append(x)
# 保存并设置文件名称
w.save('test.xlsx')
posted @ 2023-12-01 13:21  AiniIT琦玉  阅读(88)  评论(0编辑  收藏  举报