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” ]

python office 联动 python openoffice_python office 联动

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文件,循环填充准备好的数据。

python office 联动 python openoffice_设计模式_02

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. 注意:设置某一单元格的高和宽会影响整行或者整列。

python office 联动 python openoffice_设计模式_03

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 = 20

sheet.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的单元格。

python office 联动 python openoffice_设计模式_04

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文件,方便后期教学使用(具体代码含义可以不用深究,通过后面学习会逐渐了解掌握相关语法)

python office 联动 python openoffice_设计模式_05

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 在行内容后添加新的内容及段落样式。

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

python office 联动 python openoffice_python_06

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 =True

doc.save("D://addparagraph.docx")

2.6 添加标题

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

python office 联动 python openoffice_设计模式_07

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文档中。

python office 联动 python openoffice_python office 联动_08

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 wc

word = 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盘根目录。

python office 联动 python openoffice_jupyter_09

您的代码:

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

python office 联动 python openoffice_开发语言_10

您的代码:

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"垂直居中。

python office 联动 python openoffice_开发语言_11

您的代码:

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

python office 联动 python openoffice_设计模式_12

您的代码:

*(挑战)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)

python office 联动 python openoffice_开发语言_13

您的代码:

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)
            return
    print('口令格式正确')
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"+x
    else:
        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