Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门

学习目标

  1. Python处理Excel(使用openpyxl包)、图表入门\
  2. Python处理Word(使用docx包)\
  3. 课后作业(4必做1挑战)

友情提示:将下文中代码拷贝到JupyterNotebook中直接执行即可,部分代码需要连续执行。

1、Python处理Excel(使用openpyxl包)

绝大多数办公室职员,经常会同Excel打交道,一般情况下,敲几个文字、做几行数据、绘几张图表,都比较简单。但是在Excel深入应用过程中,有可能会面对一系列公式、纷繁的统计、复杂数据处理和数据分析,这时就需要一款Excel处理神器—openpyxl(python库文件),极大解放办公室生产力,用极少量代码就能玩转Excel,实现办公自动化。

openpyxl官方文档:https://openpyxl.readthedocs.io/en/stable/

1.1 安装并引入openpyxl包

在线安装命令:pip install openpyxl
清华镜像安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl

如下例,安装后引入openpyxl包,执行下例代码在D盘根目录下快速创建一个text1.xlsx文件,方便后期教学使用(具体代码含义可以不用深究,通过后面学习会逐渐了解掌握相关语法)

import openpyxl
workbook = openpyxl.Workbook()
workbook.create_sheet(index=0,title="Sheet1")# 创建3个页签
workbook.create_sheet(index=1,title="Sheet2")
workbook.create_sheet(index=2,title="Sheet3")
del workbook["Sheet"]# 删除新Excel默认页签项
workbook.active = workbook["Sheet1"]# 设置当前页签Sheet1,即光标停留的页签
sheet = workbook.active# 取当前页签
datas =[["第{}行第{}列".format(i,j) for j in range(1,4)] for i in range(1,6)]# 创建一个5行3列的数据
for data in datas:# 填充数据到表格中sheet.append(data)
workbook.save("D://text1.xlsx")# 保存表格

1.2 读取Excel文件及页签信息

  1. 使用wb = openpyxl.load_workbook(" 文件路径及文件名 ") 读取Excel文件,wb可以自己命名。
  2. 使用sheet = wb[ 页签名 ] 读取页签,sheet可以自己命名,sheet.title 输出页签名称。
  3. activesheet = wb.active 获取当前光标停留的页签即默认页签。
import openpyxl
# 读取Excel文件
wb = openpyxl.load_workbook("D://text1.xlsx")
# 读取所有页签
print("所有页签:",wb.sheetnames)
# 获取某一个页签对象
sheet = wb["Sheet2"]
print("获取某一个页签对象:",sheet," 其类型为:",type(sheet))
# 获取页签的名称
print("页签的名称是:",sheet.title)
# 获取当前光标停留的页签即默认页签
activesheet = wb.active
print("当前默认页签是:",activesheet.title)
所有页签: ['Sheet1', 'Sheet2', 'Sheet3', 'Sheet']
获取某一个页签对象: <Worksheet "Sheet2">  其类型为: <class 'openpyxl.worksheet.worksheet.Worksheet'>
页签的名称是: Sheet2
当前默认页签是: Sheet1

1.3 从页签中读取单元格信息

可以通过两种方式获取单元格信息

  1. 直接通过单元格坐标来获取对象,如sheet[“A1”]、sheet[“B2”],对象语法如下:
    sheet[“A1”].value获取单元格内容
    sheet[“A1”].row获取行号
    sheet[“A1”].column获取列号
    sheet[“A1”].coordinate获取坐标
  2. 可以通过行号+列号的方式获取对象,如sheet.cell(row=1, column=2),并通过value获取单元格内容。
import openpyxl
wb = openpyxl.load_workbook("D://text1.xlsx")# 读取Excel文件
sheet = wb["Sheet1"]# 获取Sheet1页签对象
# 输出A1单元格对象
print("A1单元格对象是:",sheet["A1"])
# 输出A1单元格内容
print("A1单元格内容是:",sheet["A1"].value)
# 输出B2单元格行、列、值
print("行: %s, 列 %s 值 %s" % (sheet["B2"].row, sheet["B2"].column, sheet["B2"].value))
print("单元格 %s 值是 %s" % (sheet["B2"].coordinate, sheet["B2"].value))
A1单元格对象是: <Cell 'Sheet1'.A1>
A1单元格内容是: 第1行第1列
行: 2, 列 2 值 第2行第2列
单元格 B2 值是 第2行第2列
import openpyxl
wb = openpyxl.load_workbook("D://text1.xlsx")# 读取Excel文件
sheet = wb["Sheet1"]# 获取Sheet1页签对象
# 通过行号+列号的方式获取单元格
print("第一行第二列的值是:",sheet.cell(row=1, column=2).value)
# 循环获取第2列前4行的值
for i in range(1, 5):print(sheet.cell(row=i, column=2).value)
第一行第二列的值是: 第1行第2列
第1行第2列
第2行第2列
第3行第2列
第4行第2列

sheet.max_row获取当前页签最大行
sheet.max_column获取当前页签最大列

import openpyxl
wb = openpyxl.load_workbook("D://text1.xlsx")# 读取Excel文件
sheet = wb["Sheet1"]# 获取Sheet1页签对象
print("最大行是第:{}行".format(sheet.max_row))
print("最大列是第:{}列".format(sheet.max_column))
最大行是第:5行
最大列是第:3列

补充:列字母和数字之间转换方法:如A列对应第1列,B列对应第2列,AA列对应第27列。
方法1:get_column_letter 将列数字转化为字母。
方法2:column_index_from_string 将列字母转化为数字。

import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string
# 将列数字转化为字母
print(get_column_letter(1))
print(get_column_letter(2))
print(get_column_letter(27))
print(get_column_letter(900))
# 将列字母转化为数字
print(column_index_from_string("A"))
print(column_index_from_string("AB"))
# 获取Sheet1页签内容最大列,并输出字母
wb = openpyxl.load_workbook("D://text1.xlsx")
sheet = wb["Sheet1"]
print("Sheet1中最大列的字母是:",get_column_letter(sheet.max_column))
A
B
AA
AHP
1
28
Sheet1中最大列的字母是: C

1.4 循环读取单元格信息

三种方式:

  1. 直接循环所包含单元格的坐标,如[ “A1” : “C3” ],输出Tuple元组格式,可再次循环每行求出每列的值。
  2. 通过行号+列号的方式循环读取,如sheet.cell(row=i, column=j)。
  3. 通过list(sheet.rows)循环行,list(sheet.columns)循环列,可单独循环某一行或者某一列。

第一种方式,直接循环坐标,如下例:

import openpyxl
wb = openpyxl.load_workbook("D://text1.xlsx")
sheet = wb["Sheet1"]
# 取A1到C3所有的单元格,输出Tuple元组格式
print(sheet["A1":"C3"])
for row in sheet["A1":"C3"]:# 循环每一行for cell in row:# 循环每一列print(cell.coordinate, cell.value)print("--- 第 {} 行结束 ---".format(cell.row))
((<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>), (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>), (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>))
A1 第1行第1列
B1 第1行第2列
C1 第1行第3列
--- 第 1 行结束 ---
A2 第2行第1列
B2 第2行第2列
C2 第2行第3列
--- 第 2 行结束 ---
A3 第3行第1列
B3 第3行第2列
C3 第3行第3列
--- 第 3 行结束 ---

第二种方式,行号+列号方式循环输出,如下例:

import openpyxl
wb = openpyxl.load_workbook("D://text1.xlsx")
sheet = wb["Sheet1"]
for i in range(1,sheet.max_row+1):# 求最大行数,循环for j in range(1,sheet.max_column+1):# 求最大列数,循环print(sheet.cell(row=i,column=j).coordinate,sheet.cell(row=i,column=j).value)
A1 第1行第1列
B1 第1行第2列
C1 第1行第3列
A2 第2行第1列
B2 第2行第2列
C2 第2行第3列
A3 第3行第1列
B3 第3行第2列
C3 第3行第3列
A4 第4行第1列
B4 第4行第2列
C4 第4行第3列
A5 第5行第1列
B5 第5行第2列
C5 第5行第3列

第三种方式,通过list(sheet.rows)、list(sheet.columns)方式循环,可单独循环某一行或者某一列,如下例:

import openpyxl
wb = openpyxl.load_workbook("D://text1.xlsx")
sheet = wb["Sheet1"]
print("---  循环行  ---")
for cell in list(sheet.rows)[0]:# 将第一行放入数组循环print(cell.coordinate,cell.value)
print("---  循环列  ---")
for cell in list(sheet.columns)[1]:# 将第二列放入数组循环print(cell.coordinate,cell.value)
---  循环行  ---
A1 第1行第1列
B1 第1行第2列
C1 第1行第3列
---  循环列  ---
B1 第1行第2列
B2 第2行第2列
B3 第3行第2列
B4 第4行第2列
B5 第5行第2列

1.5 创建和保存Excel文件

  1. 使用wb = openpyxl.Workbook() 创建新的Excel文件对象,默认生成新页签Sheet。
  2. 使用wb.save(" 文件路径及文件名 ")保存新的Excel文件。
import openpyxl
# 生成新的Excel对象
wb = openpyxl.Workbook()
# 读取新文件所有页签
print(wb.sheetnames)
# 设置当前页签为默认页签Sheet,即光标停留的页签
sheet = wb.active
print(sheet.title)
# 修改当前页签名字
sheet.title = "NewSheet"
print(wb.sheetnames)
# 保存当前Excel文件
wb.save("D://text2.xlsx")
['Sheet']
Sheet
['NewSheet']

1.6 创建和删除页签

  1. 使用wb.create_sheet(index= ,title= )创建页签,index为页签创建位置索引,title为页签名称,如不传入参数则默认依次在后面增加一个页签。
  2. 使用del wb[ 页签名 ]删除页签。
import openpyxl
wb = openpyxl.Workbook()# 创建一个新的Excel对象
# 默认在后面增加一个页签
wb.create_sheet()
print(wb.sheetnames)
# 在索引0位置插入一个页签
wb.create_sheet(index=0, title="First Sheet")
# 在索引2位置插入一个页签
wb.create_sheet(index=2, title="Middle Sheet")
print(wb.sheetnames)
# 修改 Sheet1页签的名称
wb["Sheet1"].title = "Last Sheet"
# 删除 Sheet页签
del wb["Sheet"]
print(wb.sheetnames)
# 保存当前Excel文件
wb.save("D://text3.xlsx")
['Sheet', 'Sheet1']
['First Sheet', 'Sheet', 'Middle Sheet', 'Sheet1']
['First Sheet', 'Middle Sheet', 'Last Sheet']

打开刚刚创建的text2.xlsx,分别增加、修改、删除页签,重新设置当前光标停留页签,最后保存

重新设置当前光标停留为第2个页签的方式为 wb._active_sheet_index = 1 效果等同于我们上面学习到的 wb.active = wb[ “HomeWork” ]

import openpyxl
wb = openpyxl.load_workbook("D://text2.xlsx")
print(wb.sheetnames)
wb.create_sheet(index = 1,title="HomeWork")
wb.create_sheet("MyHomeWork1")
wb["NewSheet"].title = "Notebook"
print(wb.sheetnames)
del wb["MyHomeWork1"]
# 重新设置当前光标停留为第2个页签,从0开始计数,效果等同于wb.active = wb["HomeWork"]
wb._active_sheet_index =1
print(wb.active)
wb.save("D://text2.xlsx")
['NewSheet']
['Notebook', 'HomeWork', 'MyHomeWork1']
<Worksheet "HomeWork">

1.7 单元格赋值

两种方式:

  1. 通过坐标直接给单元格赋值。
  2. 通过行号+列号的方式给单元格赋值。
  3. 通过循环填充 sheet.append(data) 的方式,快速给单元格赋值。注意,append默认会在当前最后一行的后面追加填充。

第一种方式,通过坐标直接给单元格赋值,如下例我们新创建一个Excel对象,给A1单元格赋值"Hello, world!",最后保存D://text4.xlsx。

import openpyxl
wb = openpyxl.Workbook()
sheet = wb["Sheet"]
sheet["A1"] = "Hello, world!"
print(sheet["A1"].value)
wb.save("D://text4.xlsx")
Hello, world!

第二种方式,通过行号+列号的方式给单元格赋值,如下例我们打开上面新创建的text4.xlsx文件,给第2行第3列赋值"我喜欢100分"。

import openpyxl
wb = openpyxl.load_workbook("D://text4.xlsx")
sheet = wb.active
sheet.cell(row=2,column=3,value="我喜欢100分")
print(sheet["C2"].value)
wb.save("D://text4.xlsx")
我喜欢100分

第三种方式,通过循环填充 sheet.append(data) 的方式,快速给单元格赋值,如下例我们打开上面新创建的text4.xlsx文件,循环填充准备好的数据。

import openpyxl
wb = openpyxl.load_workbook("D://text4.xlsx")
sheet = wb.active
datas=[["优秀","大于90分"],["良好","大于80分"],["及格","高于60分"],["不及格","低于60分"]] # 填充好的数据
# 循环填充数据
for data in datas:sheet.append(data)
wb.save("D://text4.xlsx")

1.8 设置单元格字体样式

语法:

  1. myFont = Font(size= ,bold= ,italic= ,…) 表示创建一种样式。
  2. [“A1”].font = myFont 表示将该样式应用于单元格A1。
常用的样式属性表
关键词 描述
name 字体名称,如Calibri、宋体、黑体等
size 字体大小
bold 字体是否加粗,Boolean
italic 字体是否斜体,Boolean
import openpyxl
from openpyxl.styles import Font
wb = openpyxl.Workbook()
sheet = wb["Sheet"]
# 创建一种样式,24号、斜体、加粗、宋体
newFont = Font(size=24, italic=True ,bold=True,name ="宋体")
# 将该样式应用于单元格A1
sheet["A1"].font = newFont
sheet["A1"] = "明天会更好!"
wb.save("D://textfont.xlsx")

1.9 Excel公式

语法:直接将公式写入单元格中,如=SUM(A1:A2)、=AVERAGE(D2:D4)、=MAX(D2:D4)等

import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet["A1"] = 200
sheet["A2"] = 300
sheet["A3"] = "=SUM(A1:A2)"
wb.save("D://textformula.xlsx")

1.10 设置行高和列宽

语法:

  1. sheet.row_dimensions[1].height = 70 设置第1行高70。
  2. sheet.column_dimensions[“B”].width = 20 设置B列宽20。
  3. 注意:设置某一单元格的高和宽会影响整行或者整列。

import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet["A1"] = "行高70"
sheet["B2"] = "列宽20"
sheet["C3"] = "高=50 宽=15
sheet.row_dimensions[1].height = 70
sheet.column_dimensions["B"].width = 20sheet.row_dimensions[3].height = 50
sheet.column_dimensions["C"].width =15
wb.save("D://texthw.xlsx")

1.11 合并单元格和拆分单元格

语法:

  1. sheet.merge_cells(“A1:D3”) 合并A1到D3的单元格。
  2. sheet.unmerge_cells(“A1:D3”) 拆分A1到D3的单元格。

import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet.merge_cells("A1:D3")# 合并单元格
sheet["A1"] = "12个单元格被合并在一起了"
sheet.merge_cells("C5:D5")
sheet["C5"] = "合并两个单元格"
wb.save("D://textmerge.xlsx")
import openpyxl
wb = openpyxl.load_workbook("D://textmerge.xlsx")
sheet = wb.active
sheet.unmerge_cells("A1:D3") # 拆分单元格
wb.save("D://textmerge.xlsx")

1.12 冻结窗格

语法:sheet.freeze_panes = “单元格坐标”,即冻结该单元格以上及以左的窗格。注意是以上和以左两个方向。

如冻结属性设置为A2,则无论用户在电子表格中滚动到何处,第1行始终可见(即被冻结)。
如冻结属性设置为B3,则无论用户在电子表格中滚动到何处,前两行和第1列始终可见(即被冻结)。\

import openpyxl
import shutil
wb = openpyxl.Workbook()
sheet = wb.active
# 冻结前两行和前两列
sheet.freeze_panes = "C3"
wb.save("D://textfreeze.xlsx")

1.13 Excel图表 Charts

OpenPyXL支持使用Excel单元格中的数据创建条形图、折线图、散点图、饼状图等工作图表,需要执行以下操作:

  1. 创建图表的数据对象。
  2. 引入数据对象。
  3. 创建一个图表元素对象。
  4. 将数据对象添加到图表元素对象中并设置图表的相关参数。
  5. 将图表添加到Excel文件中,选择生成的位置。

引入数据对象一般使用Reference()函数,至少传递两个参数:

  1. 包含图表数据的Excel页签。
  2. 该页签下数据的行列信息(最小行和列,最大行和列)。
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
# 创建图表需要的数据
for i in range(1, 21): sheet["A" + str(i)] = i
# 引入数据对象,设置包含图表数据的Excel页签,数据最小行和列,最大行和列
refObj = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=1,max_row=20)
seriesObj = openpyxl.chart.Series(refObj, title="First series")# 图例说明
# 将数据对象添加到图表元素对象中并设置图表的相关参数,柱状图、标题等
chartObj = openpyxl.chart.BarChart()
chartObj.title = "My Chart"
chartObj.append(seriesObj)
# 将图表添加到Excel文件中,选择生成的位置C5
sheet.add_chart(chartObj, "C5")
wb.save("D://sampleChart.xlsx")

2、Python处理Word(使用docx包)

2.1 安装并引入docx包

在线安装命令:pip install docx
清华镜像安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docx

如下例,安装后引入openpyxl包,执行下例代码在D盘根目录下快速创建一个demo.docx文件,方便后期教学使用(具体代码含义可以不用深究,通过后面学习会逐渐了解掌握相关语法)

import docx
doc = docx.Document()
doc.add_paragraph("面朝大海,春暖花开")
line2 = doc.add_paragraph("从明天起,")
line2.add_run("做一个幸福的人")
doc.paragraphs[1].runs[1].bold = True
line3 = doc.add_paragraph("喂马、")
line3.add_run("劈材,")
line3.add_run("周游世界")
doc.paragraphs[2].runs[0].bold = True
doc.paragraphs[2].runs[1].italic = True
doc.paragraphs[2].runs[2].underline= True
line4 = doc.add_paragraph("从明天起,关心粮食和蔬菜")
line5 = doc.add_paragraph("我有一所房子,面朝大海,春暖花开")
doc.save("D://demo.docx")

2.2 读取Word文档行数、行内容和段落样式信息

语法:

  1. len(doc.paragraphs) 读取文档总行数。
  2. doc.paragraphs[0].text 读取行内容,从0开始计算,固0为第一行,1为第二行。
  3. len(doc.paragraphs[1].runs 读取第二行有多少种段落样式。
  4. doc.paragraphs[1].runs[0].text 读取第二行第一种样式的内容
import docx
doc = docx.Document("D://demo.docx")
print("文档总行数为:",len(doc.paragraphs))
print("第一行内容为:",doc.paragraphs[0].text)print("第二行有几种样式:",str(len(doc.paragraphs[1].runs)))
print("第二行第二种样式内容为:",doc.paragraphs[1].runs[1].text)d3 = doc.paragraphs[2]
print("第三行有几种样式:",str(len(d3.runs)))for i,run in enumerate(d3.runs,1):# 分别输出不同样式的内容print("第%d种样式内容是:[%s]" %(i,run.text))
文档总行数为: 5
第一行内容为: 面朝大海,春暖花开
第二行有几种样式: 2
第二行第二种样式内容为: 做一个幸福的人
第三行有几种样式: 3
第1种样式内容是:[喂马、]
第2种样式内容是:[劈材,]
第3种样式内容是:[周游世界]

2.3 输出Word文档全部内容

我们以上面文档为例,循环输出每一行内容,加入 \n 换行符,进行拼接后输出。

import docx
def getWordText(url:"doc file path")->"file text":doc =docx.Document(url)lists =[]for para in doc.paragraphs:lists.append(para.text+"\n")return ("".join(lists))
print(getWordText(url="D://demo.docx"))
面朝大海,春暖花开
从明天起,做一个幸福的人
喂马、劈材,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开

2.4 为Word文档设置不同的段落样式

underline = True 设置下划线
bold = True 设置加粗
italic = True 设置斜体 等等

我们将第四行设置下划线,第五行设置加粗,如下例:

import docx
doc = docx.Document("D://demo.docx")
doc.paragraphs[3].runs[0].underline = True # 设置下划线
doc.paragraphs[4].runs[0].bold = True # 设置加粗
doc.save("D://demo.docx")

2.5 编写Word文档

语法:

  1. doc.add_paragraph 直接添加行内容,或者 paraObj = doc.add_paragraph 添加行内容并返回对象paraObj1,用于后期行内容处理。
  2. paraObj.add_run 在行内容后添加新的内容及段落样式。

如下例,我们添加一个标题,再分别添加两行文字,最后为第二行添加新内容和样式。

import docx
doc = docx.Document()doc.add_paragraph("你好 世界", "Title")
paraObj1 = doc.add_paragraph("这是正文第一行内容")
paraObj2 = doc.add_paragraph("这是正文第二行内容")
paraObj2.add_run(",这是第二行添加的内容(加粗显示)")
doc.paragraphs[2].runs[1].bold =Truedoc.save("D://addparagraph.docx")

2.6 添加标题

语法:doc.add_heading(“标题内容”, 标题大小)

import docx
doc = docx.Document()
doc.add_heading("Header 0", 0)
doc.add_heading("Header 1", 1)
doc.add_heading("Header 2", 2)
doc.add_heading("Header 3", 3)
doc.add_heading("Header 4", 4)
doc.save("D://addpheader.docx")

2.7 添加分页符

语法:doc.paragraphs[0].runs[0].add_break(docx.enum.text.WD_BREAK.PAGE),在相应的段落加入分页符

import docx
doc = docx.Document()
doc.add_paragraph("这是第一页内容")
doc.paragraphs[0].runs[0].add_break(docx.enum.text.WD_BREAK.PAGE)# 加入分页符
doc.add_paragraph("这是第二页内容")
doc.save("D://page.docx")

2.8 添加图片

语法:doc.add_picture(" 图片路径及文件名 ",width=宽度,height=长度)

如下例,我们在网上获取一张图片下载到D盘根目录,然后将其添加到Word文档中。

import docx
import requests
# 获取网络图片并下载到本地
r = requests.get("https://pic1.zhimg.com/v2-520a7ccc637a39f664556ad5d7e090c4_1440w.jpg")
r.encoding="utf-8"
with open ("D://picture.jpg","wb") as picturefile:picturefile.write(r.content)
# 将本地图片添加到文档中
doc = docx.Document()
doc.add_paragraph("这是一张图片")
# 添加图片 设置宽10厘米高5厘米
doc.add_picture("D://picture.jpg",width=docx.shared.Cm(10),height=docx.shared.Cm(5))
doc.save("D://picture.docx")

*(扩展) 2.9 将Word文档转化为Pdf

我们引入client转化包,设置后台运行及不警告,读取Word文档的绝对地址,按17号进行转化(txt=4, html=10, docx=16,pdf=17)。

from win32com import client as wcword = wc.Dispatch("Word.Application")
word.Visible = 0 # 后台运行,不显示
word.DisplayAlerts = 0  #不警告
doc = word.Documents.Open("D://demo.docx")# 需要写入绝对地址
doc.SaveAs("D://demo.pdf", 17) # txt=4, html=10, docx=16, pdf=17
doc.Close()
word.Quit()

3、课后作业,答案在下一讲

1、创建一个名为《课程》的excel文件,再分别创建《学生表》、《课程表》、《课时数》三个页签,设置《课程表》为当前页签,保存到C盘根目录。

您的代码:

2、打开《课程表》,删除默认《Sheet》页签, 修改《课时数》页签名称为《课时统计》,打开《课程表》页签,设置A1的内容为"我的课程表",要求黑体、20号字、加粗,设置A1行高为30,固定(冻结)第一行,操作完后保存。

您的代码:

3、打开《课程表》,打开《课程表》页签,将[A1:E1]合并,水平居中垂直居中对齐;在第二行循环插入[“星期1”,“星期2”,“星期3”,“星期4”,“星期5”],并设定每一列宽度为15,加粗并水平居中,操作完后保存。

提示:

  1. 居中设置需要引入包from openpyxl.styles import Alignment。
  2. 对单元格A1设置水平及垂直居中的方法:sheet[“A1”].alignment = Alignment(horizontal=“center”, vertical=“center”)。
  3. horizontal="center"水平居中,vertical="center"垂直居中。

您的代码:

4、打开《课程表》,打开《课程表》页签,使用append方式逐行填充下方课表内容,内容水平居中,输出最大行数和最大列数,操作完后保存。

您的代码:

*(挑战)5、打开《课时统计》页签,填充以下数据,最后一行为总课时数,将每种课时绘制成饼图在单元格D1输出,操作完后保存。

提示:

  1. 引入饼状图相关包 from openpyxl.chart import Reference,PieChart 。
  2. pie = PieChart()生成饼状图对象。
  3. labels = Reference() 设置标签。
  4. datas = Reference() 设置数据。
  5. pie.add_data(datas,titles_from_data=True) 填充数据。
  6. pie.set_categories(labels) 填充标签。
  7. pie.title=" " 设置饼图标题。
  8. sheet.add_chart(pie,“D1”) 饼图添加进表格
课程 课时
语文 5
数学 5
英语 3
物理 3
化学 3
历史 2
政治 2
总课时 SUM(B2:B9)

您的代码:

4、上一讲Python零基础速成班-第13讲-Python正则表达式Regex 课后作业及答案

1、输入一个IP地址,确认是否是合法的A类IP地址。(A类IP地址 地址范围1.0.0.0到126.255.255.255)

import re
iptext = input("请输入IP地址:")
ipregex = re.compile(r'(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})')
ip = ipregex.search(iptext)
ip1 = ip.group(1)
ip2 = ip.group(2)
ip3 = ip.group(3)
ip4 = ip.group(4)
if 1 <= int(ip1) <= 126 and 0 <= int(ip2) <= 255 and 0 <= int(ip3) <= 255 and 0 <= int(ip4) <= 255:print('IP地址合法')
else:print('IP地址不合法')
请输入IP地址:125.9.18.254
IP地址合法

2、写一个函数,它使用正则表达式,确保传入的口令字符串是强口令。强口令的定义是:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间。

import re
def strong_password(password):condition=[r'\w{8,16}',r'[a-zA-Z]+',r'\d+']for pattern in condition:pwd=re.compile(pattern).search(password)if pwd == None:print('口令:%s 格式错误'%password)returnprint('口令格式正确')
password=input('请输入口令:\n')
strong_password(password)
请输入口令:
123abc999v
口令格式正确

3、这是一个封群发邮件内容,请你用正则表达式将somebody替换成对应姓名,需要替换的姓名列表为 [‘Alice’,‘Tony’,‘Henry’,‘Jack’,‘Yilia’],替换完成后请依次将内容打印出来,邮件内容为:

Hello somebody ,welcome to my home ,I’m waiting for you.

import re
names = ['Alice','Tony','Henry','Jack','Yilia']
note = "Hello somebody ,welcome to my home ,I'm waiting for you."
noteRegex = re.compile(r"(?<=Hello )\w+")#以Hello 开头,以","结束的字符串,即为somebody
for name in names:mo = noteRegex.sub(name,note)print(mo)
Hello Alice ,welcome to my home ,I'm waiting for you.
Hello Tony ,welcome to my home ,I'm waiting for you.
Hello Henry ,welcome to my home ,I'm waiting for you.
Hello Jack ,welcome to my home ,I'm waiting for you.
Hello Yilia ,welcome to my home ,I'm waiting for you.

4、将下列不同格式的日期,转换成相同格式yyyy-mm-dd并依次打印出来

输入日期格式有可能如下:
20210601
2021-06-01
2021/06/01
2021/6/1
2021年6月1日
2021年06月01日

import re
dataList = ["20210601","2021-06-01","2021/06/01","2021/6/1","2021年6月1日","2021年06月01日"]
def add(x)->"补齐月和日位数":if len(x)==1:return "0"+xelse:return x
dataRegex = re.compile(r'(\d{4})\D?(\d{1,2})\D?(\d{1,2})\D?')
for data in dataList:d1 = dataRegex.search(data).group(1)d2 = dataRegex.search(data).group(2)d3 = dataRegex.search(data).group(3)print(d1+add(d2)+add(d3))
20210601
20210601
20210601
20210601
20210601
20210601

Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门相关推荐

  1. Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合

    Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...

  2. Python零基础速成班-第5讲-Python函数,Function和Lambda基础

    Python零基础速成班-第5讲-Python函数,Function和Lambda基础 学习目标 Function函数 Lambda Function函数 课后作业(4必做) 友情提示:将下文中代码拷 ...

  3. Python零基础速成班-第6讲-Python异常处理Exception,tryexcept,raise,assert,输入模块pyinputplus

    Python零基础速成班-第6讲-Python异常处理Exception,try&except,raise,assert,输入模块pyinputplus 学习目标 异常处理Exception: ...

  4. Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云)

    Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云) 学习目标 获取网络数据Socket API接口 网络爬虫Crawler(制 ...

  5. Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life

    Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life 学习目标 Python日志Logging 小游戏设计game of life 课后作业(2必做) ...

  6. Python零基础速成班-第8讲-Python文件操作File IO、高级文件处理模块shutil、CSV、JSON、多线程基础

    Python零基础速成班-第8讲-Python文件操作File I&O.高级文件处理模块shutil.CSV.JSON.多线程基础 学习目标 文件操作File I/O 高级文件处理模块shut ...

  7. Python零基础速成班-第2讲-Python基础(上),运算、变量、数据类型、输入输出

    Python零基础速成班-第2讲-Python基础(上),运算.变量.数据类型.输入输出 学习目标 使用print输出结果 运算及运算符 变量 数据类型(4种最常用的) 输入输出 课后作业(4必做+1 ...

  8. Python零基础速成班-第13讲-Python正则表达式Regex

    Python零基础速成班-第13讲-Python正则表达式Regex 学习目标 正则表达式 课后作业(4必做) 友情提示:将下文中代码拷贝到JupyterNotebook中直接执行即可,部分代码需要连 ...

  9. Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用

    Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...

最新文章

  1. R 变量名开头不能为数字
  2. 纪中2016.8.13比赛不明总结
  3. 【编程】为什么不能直接对链表头head进行操作?
  4. 菜单之一:Menu基础内容
  5. 用 Visual Studio 发布一个 Azure 云 Web 应用程序
  6. Java Formatter out()方法与示例
  7. 使用OSHI 检索系统信息,超牛逼、超级秀、超级巴适!!快来看看吧!不然你会后悔的!!666
  8. Java 7 最快要到 2012 年中发布
  9. mycat1.4.1小白用户入门(一)
  10. webpack教程(二)——webpack.config.js文件
  11. java实现节假日维护_谈谈JAVA实现节假日验证
  12. echarts常见图形-不同种类不同颜色柱状图(二)
  13. 华为刷原生android,教你如何体验(刷)原生安卓8.0
  14. Flurry 分析 API 中文教程(Flurry Analytics API)
  15. 读《解忧杂货店》有感
  16. Java对象扁平化的操作
  17. python学习之路08(正则表达式和网络)
  18. DoraCloud for Proxmox桌面云上启用NVIDIA Tesla P4的vGPU功能
  19. iPhone 和iPad的Icon大小和设置
  20. 稳住不慌:运维职业成长路线规划

热门文章

  1. CS1.6找金钱和人物血量
  2. App自动化测试之Java平台下使用Appium测试App(二)
  3. Andriod Studio VT-x is disabled in BIOS”的解决办法
  4. mtk平台usb序列号与手机序列号
  5. 短文本相似度在线计算_短文本相似度在线比较_短文本相似度在线查询_自然语言处理_百度AI开放平台
  6. 中以海德携手百度健康 探讨AI助力乙肝防治
  7. Windows2008关机时蓝屏而后重启的解决
  8. CIKM 2021 | FKGE:差分隐私的联邦知识图谱嵌入
  9. when和while的区别
  10. 安装Oracle数据库客户端时出现:INS-13001环境不满足最低要求问题