day8-代码操作.xls文件

一、发送学生成绩

# 1. 准备数据
import openpyxl

# 1)获取excel文件中两张表中的所有数据
wb = openpyxl.open('files/python数据分析.xlsx')
stu_sheet = wb['学生信息']
con_sheet = wb['学生联系方式']

# a.获取第一张表中的数据
stu_info = []
m_r1, m_c1 = stu_sheet.max_row, stu_sheet.max_column
for row in range(2, m_r1+1):
    stu = {}
    for col in range(1, m_c1+1):
        stu[stu_sheet.cell(1, col).value] = stu_sheet.cell(row, col).value
    stu_info.append(stu)
# print(stu_info)

# b.获取第二张表中的数据
contact_info = []
m_r2, m_c2 = con_sheet.max_row, con_sheet.max_column
"""
[
    {'email': '874616871@qq.com', 'msg':'李楠同学你好,以下是你本次期末考试各科成绩:\n英语: 78分\n办公软件操作:96分\n....'}
]
"""
all_con = []
for row in range(2, m_r2+1):
    con = {}
    name = con_sheet.cell(row, 1).value
    address = con_sheet.cell(row, 4).value
    con['email'] = address
    # 在第一张表对应的数据中获取学生对应的分数信息
    for stu in stu_info:
        if stu['姓名'] == name:
            # 根据学生信息对应的字典(stu),去构建邮件中成绩的部分
            result = ''
            for key in stu:
                if key != '姓名':
                    result += '      %s: %s分\n' % (key, stu[key])
            con['msg'] = '%s同学你好,以下是你本次期末考试各科成绩:\n%s' % (name, result)
            # con['msg'] = '%s同学你好,以下是你本次期末考试各科成绩:\n%s' % (name, stu)
    all_con.append(con)
print(all_con)

# 2.发邮件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText

connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
connect.login('874616871@qq.com', 'lwxfnvtbnfpjbfbg')

# 遍历拿到每个联系信息,构建对应的邮件并发送
for con in all_con:
    to_address = con['email']
    email = MIMEMultipart()
    email['Subject'] = Header('考试成绩', 'utf-8').encode()
    email['From'] = 'ZHL <874616871@qq.com>'
    email['To'] = to_address

    msg = MIMEText(con['msg'], 'plain')
    email.attach(msg)
    connect.sendmail('874616871@qq.com', to_address, email.as_string())

connect.close()

字符串操作

# 练习:
# 将字典:{'姓名': '赵军力', '英语': 69, '办公软件操作': 69, '电子商务': 63, '计算机基础': 76}
# 构建成字符串:"英语: 69分\n办公软件操作:69分\n电子商务:63分\n计算机基础:76分"

'英语: 69分\n办公软件操作: 69分\n...'

dict1 = {'姓名': '赵军力', '英语': 69, '办公软件操作': 69, '电子商务': 63, '计算机基础': 76}
result = ''
for key in dict1:
    if key != '姓名':
        result += '%s: %s分\n' % (key, dict1[key])
print(result)

二、XLS文件读操作

1.打开excel文件获取工作薄对象
import xlrd
wb = xlrd.open_workbook('files/data1.xls')
2.获取所有的工作表的表名
names = wb.sheet_names()
print(names)
3. 获取工作表
# 工作簿对象.sheet_by_name(表名)  -  获取指定表名对应的工作表
# 工作簿对象.sheet_by_index(下标)  -   获取指定下标对应的工作表
sheet1 = wb.sheet_by_name('students')
print(sheet1)

sheet2 = wb.sheet_by_index(1)
print(sheet2)
4. 获取表的行数和列数(有数据部分的行和列)
print(sheet1.nrows)
print(sheet1.ncols)
5. 按行或者按列获取数据
# 工作表.row_values(行下标)       -    获取指定行所有的数据
# 工作表.col_values(列下标)       -    获取指定列所有的数据
# 工作表.row_values(行下标, 开始列下标, 结束列下标) -   获取指定行中指定范围的数据
# 工作表.col_values(列下标, 开始行下标, 结束行下标)  -  获取指定列中指定范围的数据
#注意:从0开始
result = sheet1.row_values(1)
print(result)

result = sheet1.col_values(3)
print(result)

result = sheet1.col_values(3, 1)
print(result)

result = sheet1.row_values(2, 0, 3)
print(result)
6. 获取指定单元格中的数据
# 工作表.cell_value(行下标, 列下标)
result = sheet1.cell_value(0, 0)
print(result)

三、XLS文件读操作练习

# 练习:读excel文件data1.xls中students表中的数据,得到一个大列表,列表中的每个元素是每一行内容对应的小列表
"""
[
    ['小明', '男', 20, 99],
    ...
]

[   
    {'姓名': '小明', '性别': 男, '年龄': 20, '分数': 99}
]
"""

import xlrd

wb = xlrd.open_workbook('files/data1.xls')
stu_sheet = wb.sheet_by_name('students')

# 获取行数量
num_row = stu_sheet.nrows

# =========情况1:每一行对应一个小列表=========
datas = []

for index in range(1, num_row):
    line = stu_sheet.row_values(index)
    datas.append(line)

print(datas)
# =========情况2:每一行对应一个小字典=========
datas = []
keys = stu_sheet.row_values(0)
# print(keys)

for index in range(1, num_row):
    line = stu_sheet.row_values(index)
    stu = {}
    for x in range(len(keys)):
        key = keys[x]
        value = line[x]
        stu[key] = value
    datas.append(stu)

    # datas.append({keys[index]: line[index] for index in range(len(keys))})

print(datas)

四、XLS文件写操作

import xlwt

# 1.新建工作簿
wb = xlwt.Workbook()

# 2. 新建工作表
stu_sheet = wb.add_sheet('students')

# 3. 写入数据
# 工作表.write(行下标, 列下标, 数据)
stu_sheet.write(0, 0, 'name')

# 保存文件
wb.save('files/data2.xls')

五、Xlwt修改单元格样式

import xlwt

wb = xlwt.Workbook()
sheet = wb.add_sheet('样式')

# 1.创建样式对象
style1 = xlwt.XFStyle()

# 2.添加字体样式
font1 = xlwt.Font()
font1.name = '黑体'
font1.bold = True
font1.height = 20*20
font1.colour_index = 12
style1.font = font1

# 3.添加边框样式
b1 = xlwt.Borders()
b1.bottom = 10
b1.bottom_colour = 16
style1.borders = b1

# 4.添加对齐样式
style2 = xlwt.XFStyle()
al1 = xlwt.Alignment()
al1.vert = xlwt.Alignment.VERT_CENTER
al1.horz = xlwt.Alignment.HORZ_CENTER
al1.rota = 90
style2.alignment = al1

# 5.添加填充样式
p1 = xlwt.Pattern()
p1.pattern = xlwt.Pattern.SOLID_PATTERN
p1.pattern_fore_colour = 13
style1.pattern = p1

sheet.write(0, 0, '名字', style=style1)
sheet.write(2, 3, '对齐格式', style=style2)

# 6.合并单元格
# 工作表.write_merge(行下标1, 行下标2, 列下标1,列下标2, 数据, 样式)
sheet.write_merge(8, 8, 2, 6, 'hello', style1)
sheet.write_merge(12, 22, 2, 7, 'hello', style2)

# 7.设置列的宽度和行的高度
# 1)设置列的宽度
sheet.col(0).width = 30*256

# 2)设置行的高度
# 运行指定的行可以设置高度
sheet.row(0).height_mismatch = True
# 设置行的高度
sheet.row(0).height = 30*60

六、xls文件写操作练习

# 写入到data3.xls文件中
# 第一行的内容分别是:name、gender、age、score
# 1. 准备数据
data = [
    ['小明', '男', 20.0, 99.0],
    ['张三', '男', 25.0, 87.0],
    ['小花', '女', 22.0, 95.0],
    ['老王', '男', 30.0, 77.0]
]

line1 = ['name', 'gender', 'age', 'score']

data.insert(0, line1)

# 2. 准备工作表
import xlwt

wb = xlwt.Workbook()
stu_sheet = wb.add_sheet('students')
print(data)
# 3. 写入数据
# rowx = 0 1 2 3 4
for row_x in range(len(data)):
    row_data = data[row_x]
    for col_x in range(len(row_data)):
        stu_sheet.write(row_x, col_x, row_data[col_x])

# 4.保存数据
wb.save('files/data3.xls')

七、xls文件设置单元格样式

import xlwt

# 注意:xlwt设置样式的时候,如果需要颜色值(字体颜色、填充颜色、边框颜色),
# 颜色值只能使用xlwt.Style.colour_map中提供的颜色值
print(xlwt.Style.colour_map)
wb = xlwt.Workbook()
sheet = wb.add_sheet('各种样式')
sheet.write(0, 0, '香蕉')

# 1. 创建样式对象
style1 = xlwt.XFStyle()

# 2. 创建字体对象
font1 = xlwt.Font()

# 3. 将字体对象关联到样式中
style1.font = font1

# 4. 设置字体相关属性
font1.name = '宋体'    # 设置字体名称
font1.height = 20*20        # 设置字体大小
font1.colour_index = 28     # 设置字体颜色
font1.bold = True           # 是否加粗
font1.italic = True         # 是否倾斜

# 5. 写入数据的时候添加样式
sheet.write(1, 0, '苹果', style1)

# 1. 创建样式对象
style2 = xlwt.XFStyle()

# 2. 创建填充对象
pattern1 = xlwt.Pattern()

# 3. 将填充对象关联到样式对象中
style2.pattern = pattern1

# 4. 设置填充属性
pattern1.pattern = xlwt.Pattern.SOLID_PATTERN       # 设置填充模式
pattern1.pattern_fore_colour = 52                   # 设置填充颜色

# 5.写入数据的时候添加样式
sheet.write(1, 1, '猕猴桃', style2)

# 1. 设置列宽度
sheet.col(0).width = 50 * 256

# 2. 设置行高
# 1) 允许设置某一行的高度
sheet.row(2).height_mismatch = True

# 2) 设置指定行的高度
sheet.row(2).height = 40*60

wb.save('files/data4.xls')

八、作业-颜色对照表

import xlwt

# 1. 准备数据
data = xlwt.Style.colour_map
print(data)

# 2. 准备工作表
wb = xlwt.Workbook()
sheet = wb.add_sheet('颜色对照表')

# 3. 将数据写入到工作表中
# 1)
line1 = ['颜色', '颜色单词', '颜色值']

style1 = xlwt.XFStyle()

# 设置字体样式
font1 = xlwt.Font()
style1.font = font1
font1.name = '黑体'
font1.bold = True
font1.height = 16 * 16

# 设置对齐方式
alignment1 = xlwt.Alignment()
style1.alignment = alignment1
alignment1.vert = xlwt.Alignment.VERT_CENTER
alignment1.horz = xlwt.Alignment.HORZ_CENTER

# 设置边框
border = xlwt.Borders()
style1.borders = border
border.left = border.right = border.top = border.bottom = 1
border.left_colour = border.right_colour = border.top_colour = border.bottom_colour = 8

# 设置第一行的高度
sheet.row(0).height_mismatch = True
sheet.row(0).height = 10 * 60

for col in range(len(line1)):
    # 设置每一列的宽度
    sheet.col(col).width = 20 * 256
    # 写入数据
    sheet.write(0, col, line1[col], style1)


# 2)
# 准备样式
style2 = xlwt.XFStyle()

font2 = xlwt.Font()
style2.font = font2
font2.height = 14 * 14

style2.alignment = alignment1
style2.borders = border

# 写入数据
row = 1
for key in data:
    value = data[key]

    # 第一列单元格的样式
    style3 = xlwt.XFStyle()
    style3.borders = border

    pattern = xlwt.Pattern()
    style3.pattern = pattern
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = value

    # 写入数据
    sheet.write(row, 0, '', style3)
    sheet.write(row, 1, key, style2)
    sheet.write(row, 2, value, style2)

    # 设置行高
    sheet.row(row).height_mismatch = True
    sheet.row(row).height = 10 * 60

    row += 1

wb.save('files/颜色.xls')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值