Python数据分析3—openpyxl


一、基础知识

1.安装

openpyxl是用来处理Excel电子表格的Python第三方库,使用前需要现安装,pip install openpyxl

2.新建工作簿

from openpyxl import Workbook

# 新建工作簿
new_wb = Workbook()
# 将新建的工作簿保存为【新的Excel工作表.xlsx】
new_wb.save('./新的Excel工作表.xlsx')

3.读取工作簿

  1. openpyxl.load_workbook()可读取工作簿对象。
  2. **工作簿对象[‘工作表’]**可读取工作表。
  3. **工作表对象[行数]工作表对象[‘列名’]**可读取行和列,得到一个元祖。
  4. **工作表对象[行列]**得到一个单元格对象Cell
  5. 单元格对象.value得到这个单元格对象具体的值。
    from openpyxl import load_workbook
    
    # 打开【21计3成绩表.xlsx】工作簿
    wb = load_workbook('./Python成绩表.xlsx')
    
    # 获取【'21计3'】工作表
    ws_21J3 = wb['21计3']
    
    # 循环打印出第2行所有单元格的值
    for cell_2 in ws_21J3[2]:
        print(cell_2.value)
    
    # 循环打印出第2列(B列)所有单元格的值
    for cell_B in ws_21J3['B']:
        print(cell_B.value)
    
    # 打印出B1单元格的值
    print(ws_21J3['B1'].value)
  • 工作表对象还有iter_rows()方法,可以获得表中指定范围的数据。
  • 参数min_rowmax_row分别表示最小行索引和最大行索引,参数min_colmax_col分别表示最小列索引和最大列索引。最小行索的值默认为1,最大索引的值默认为表格中有数据的最下面一行的行数。
  • 参数values_only决定是否返回单元格的值,如果为True则返回单元格的值,如果为False则返回单元格对象
from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 返回第2行至第12行,第2列(B列)至第3列(C列)这个范围的单元格内的所有数据
for row in ws_21J3.iter_rows(min_row=2, max_row=4, min_col=2, max_col=3, values_only=True):
    print(row)

4.添加数据

from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 添加数据只能是列表和元祖类型
ws_21J3.append(['31','新同学','男','55'])

# 添加完成后必须保存
wb.save('./Python成绩表.xlsx')

注意,如果要保存文件,别把工作簿打开,会报错。

二、制作查询功能

查询可以用字典的键值对来实现。

from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 创建学生信息字典
student_info = {}

# 从第二行开始读取工作表中的信息
for row in ws_21J3.iter_rows(min_row=2, values_only=True):
    # 取出学号
    student_number = row[0]
    # 将信息存入学生信息字典
    student_info[student_number] = {
        '学号':row[0],
        '姓名':row[1],
        '性别':row[2],
        '成绩':row[3],
    }
    
print(student_info)
print(student_info[16]['姓名'])

完善一下交互体验吧。

from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 创建学生信息字典
students_info = {}

# 从第二行开始读取工作表中的信息
for row in ws_21J3.iter_rows(min_row=2, values_only=True):
    # 取出学号
    student_number = row[0]
    # 将信息存入学生信息字典
    students_info[student_number] = {
        '学号':row[0],
        '姓名':row[1],
        '性别':row[2],
        '成绩':row[3],
    }

while True:
    try:
        # 输入你想查询的员工的工号
        student_number = int(input('请输出你想要查询的学号:'))
    except:
        print('请输入数字啊!!!')
        continue
    try:
        # 根据学号(键)找到学生信息(值)
        student_info = students_info[student_number]
    except:
        print('数据表中没有这个学号')
        continue

    search_info = input('请输出你想查询的信息(如:姓名/性别/成绩):')
    # 判断该员工信息是否存在
    if student_info.get(search_info):# dict.get()返回指定键的值,如果键不在字典中返回默认值 None 或者设置的默认值。  
        print(f'经查询,该学生的{search_info}{student_info[search_info]}')
    else:
        print('输入错误,只能查询姓名/性别/成绩')

三、筛选迟到同学信息

现需要筛选出迟到时间超过50分钟,并且迟到次数超过3次的同学,并将信息写入一张新的表格。

from openpyxl import load_workbook,Workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

#获得表头
header = []
for row in ws_21J3[1]:
    header.append(row.value)

# 新建工作簿,存储迟到人员信息
new_wb = Workbook()
new_ws = new_wb.active  # 获得活动工作表(第一张表)

# 先写入表头
new_ws.append(header)

# 从第二行开始依次读取
for row in ws_21J3.iter_rows(min_row=2,values_only=True):
    name = row[1]
    late_time = row[4]
    late_number = row[5]
    if late_time > 50 and late_number > 3:
        print(f"{name}迟到了{late_time}分钟,迟到了{late_number}次。")
        new_ws.append(row)  # 将迟到人员的信息写入新表

# 保存文件
new_wb.save('./迟到同学信息.xlsx')

四、找出悄悄改成绩的同学

在录入成绩之前,有同学趁办公室没人,悄悄修改了自己的成绩,为预防这种情况,成绩单还留了一份旧表,现需要对比两张表格,找出那个悄悄改成绩的同学。

from openpyxl import load_workbook,Workbook

# 打开原来的工作簿、工作表
old_wb = load_workbook('./Python成绩表.xlsx')
old_ws = old_wb['21计3']

# 将旧表的信息做成一个字典,字典格式为{姓名:成绩}
score_dict = {}
for row in old_ws.iter_rows(min_row=2,values_only=True):
    score_dict[row[1]] = row[3]

# 打开被改动之后工作簿、工作表
new_wb = load_workbook('./Python成绩表(被悄悄改动过).xlsx')
new_ws = new_wb['21计3']

# 将新表中的数据一行行的拿出来对比
for row in new_ws.iter_rows(min_row=2,values_only=True):
    name = row[1]
    score = row[3]
    if score != score_dict[name]:
        print(f"{name}的成绩不对,和旧表匹配不上")

文章作者: 彭韦浩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭韦浩 !
  目录