day 10-Pyhton操作word文件
一、word文档基本内容
安装第三方库: python-docx
from docx import Document
1.创建空白的word文档
doc = Document()
2.添加标题
文档对象.add_heading(标题内容, level=级别, style=None)
注意:级别范围:1 ~ 9, 0 - 表示正文
doc.add_heading('一级标题', level=1)
doc.add_heading('二级标题', level=2)
doc.add_heading('三级标题', level=3)
doc.add_heading('四级标题', level=4)
doc.add_heading('五级标题', level=5)
3.添加正文段落
文档对象.add_paragraph(正文内容, style=None)
doc.add_paragraph('你好,世界')
doc.add_paragraph('2023年经济工作部署。')
4.添加换页
文档对象.add_page_break()
doc.add_page_break()
5.添加表格
1)文档对象.add_table(行数, 列数) - 添加表格
2)表格对象.cell(行下标, 列下标) - 获取表格中指定的单元格
3)单元格对象.text = 数据 - 修改单元格内容
table = doc.add_table(3, 4)
cell1 = table.cell(0, 0)
cell1.text = '姓名'
6.添加图片
# 文档对象.add_picture(图片地址, width=None, height=None)
doc.add_picture('files/cat.png')
# 保存
doc.save('files/demo1.docx')
二、文档中的内容样式
导入需要的库
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
样式设置优先级问题:document < paragraph < heading < run
doc = Document()
h1 = doc.add_heading('高启强为什么解领带擦玻璃', level=1)
1.标题常用的样式
# 1)让标题内容在文档中居中显示
h1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 2)设置标题的字体大小
h1.style.font.size = Pt(25)
# 3)设置标题的文字颜色
h1.style.font.color.rgb = RGBColor(95, 158, 160)
# 注意:标题设置字体名称无效
2.段落常用的样式
设置在某一个段落上的样式会同时作用在所有的段落。
p1 = doc.add_paragraph('二刷狂飙的时候,高启强为什么解领带擦玻璃?其中有一段无声的镜头,什么也没说,又什么都说了。高无声靠近,又手握拳头,赵立冬有个下意识躲的动作,这段谁懂为什么呢?')
# 1)设置字体名称
p1.style.font.name = '宋体'
# 注意:如果使用的字体是中文字体,必须加下面的代码
r = p1.style._element.rPr.rFonts
r.set(qn('w:eastAsia'), '宋体')
# 2)设置字体大小
p1.style.font.size = Pt(15)
# 3)设置字体颜色
p1.style.font.color.rgb = RGBColor(255, 0, 0)
# 4)设置字体加粗
p1.style.font.bold = True
# 5)字体倾斜
p1.style.font.italic = True
# 6)添加下划线
p1.style.font.underline = True
# 7)添加删除线
p1.style.font.strike = True
# 8)添加阴影效果()
p1.style.font.shadow = True
3.run的用法
给word文档提供文字内容的时候有两种方式:
- 直接提供文字内容: doc.add_paragraph(文字内容)、doc.add_heading(文字内容)
- 通过run对象提供文字内容
h2 = doc.add_heading(level=2)
run1 = h2.add_run('大家都在搜')
run2 = h2.add_run('"高启强"')
p2 = doc.add_paragraph()
run3 = p2.add_run('解领带缠手可以砸碎玻璃打他,也可以像他一样')
run4 = p2.add_run('擦玻璃')
run5 = p2.add_run('。赵立冬也领会到了高启强的意思,开始以为要打他,有了挪动位置的动 作,后面看到在擦玻璃,露出了笑容,高启强玩得一手心理战')
run4.font.bold = True #加粗
run3.font.color.rgb = RGBColor(0, 255, 0) #设置颜色
4.段落间距相关样式
注意:段落间距相关样式,只会作用在当前段落上
p4 = doc.add_paragraph('解领带缠手可以砸碎玻璃打他,也可以像他一样擦玻璃。赵立冬也领会到了高启强的意思,开始以为要打他,有了挪动位置的动 作,后面看到在擦玻璃,露出了笑容,高启强玩得一手心理战')
# 1.行间距(段落内)
p4.paragraph_format.line_spacing = 1.5
# 2.段前距离
p4.paragraph_format.space_before = Pt(30)
# 3.段后距离
p4.paragraph_format.space_after = Pt(40)
# 4.行首缩进
p4.paragraph_format.first_line_indent = Pt(50)
doc.save('files/demo2.docx')
三、设置主题样式
导入需要的库
from docx import Document
from docx.enum.style import WD_STYLE_TYPE, WD_BUILTIN_STYLE
from docx.shared import Pt, Cm, RGBColor
doc = Document()
# 所有的主题样式
styles = doc.styles
主题样式有三种:基于run添加的样式、基于paragraph、基于table
1. 基于run的主题样式的使用
# 1)用法
h1 = doc.add_heading(level=1)
run1 = h1.add_run('hello world!', style='Subtle Reference')
run1.font.size = Pt(40)
p1 = doc.add_paragraph()
p1.add_run('hello world!', style='Subtle Emphasis')
doc.add_heading('1. 基于run添加的所有的主题名称对应的样式:')
# 2)将和run相关的所有的主题样式显示出来
for x in styles:
if x.type == WD_STYLE_TYPE.CHARACTER:
p = doc.add_paragraph()
p.add_run('character(run) style is: ' + x.name, style=x.name)
2.基于paragraph的主题样式的用法
p2 = doc.add_paragraph('弟弟的死是自己心中永远的痛', style='Title')
doc.add_heading('2. 基于paragraph添加的所有的主题名称对应的样式:')
for x in styles:
if x.type == WD_STYLE_TYPE.PARAGRAPH:
doc.add_paragraph('paragraph style is: ' + x.name, style=x.name)
3.基于table的主题的用法
doc.add_table(4, 3, style='Medium Grid 3 Accent 4')
doc.add_heading('2. 基于table添加的所有的主题名称对应的样式:')
for x in styles:
if x.type == WD_STYLE_TYPE.TABLE:
p = doc.add_paragraph('表格主题名称: ' + x.name)
p.paragraph_format.space_before = Pt(50)
doc.add_table(2, 3, style=x.name)
#保存文件
doc.save('files/demo3.docx')
四、表格的使用
1. 添加表格
table = doc.add_table(3, 4, style='Table Grid')
2.添加行和列
table.add_row() # 在最下面添加一行
table.add_column(Pt(100)) # 在最右边添加一列
3.设置单元格内容
# 1)直接给单元格内容赋值
cell1 = table.cell(0, 0)
cell1.text = '名字'
cell1.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
# 2)通过获取单元格的段落对象添加run来赋值
cell2 = table.cell(0, 1)
p = cell2.paragraphs[0]
run1 = p.add_run('价格')
run2 = p.add_run('(元)')
4.设置表格样式
# 1)直接设置表格样式,会作用于整个表格
table.style.font.size = Pt(14)
table.style.font.color.rgb = RGBColor(100, 89, 10)
table.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 2)基于单元格设置样式,必须基于单元格内容对应的run对象来设置
run1.font.color.rgb = RGBColor(255, 0, 0)
5.行高和列宽
# 设置每一行的高度
rows = table.rows # 获取所有的行
cols = table.columns # 获取所有的列
for row in rows:
# 获取所有的单元格
print(row.cells)
row.cells[1].text = '200'
# 获取行下标
print(row._index)
if row._index == 0:
# 设置行高:行对象.height = 高度
row.height = Pt(40)
for cell in row.cells:
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
else:
row.height = Pt(25)
for col in cols:
# 获取一列中所有的单元格
print(col.cells)
col.cells[0].text = 'hello'
# 获取列下标
print(col._index)
# 保存文件
doc.save('files/demo4.docx')
五、作业
用python设计期末报告word文档:
要求:
1)添加封面
2)添加学生信息表格
3)设计文档
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Pt, RGBColor, Cm
from docx.oxml.ns import qn
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
import openpyxl
#-------------------------封面-----------------------
doc = Document()
table = doc.add_table(1, 2, style='Normal Table')
cell1 = table.cell(0, 0)
ph = cell1.paragraphs[0]
run = ph.add_run('')
run.add_break()
pc = run.add_picture('files/校徽.png', width=Pt(100), height=Pt(100))
cell2 = table.cell(0, 1)
p = cell2.paragraphs[0]
run1 = p.add_run('度假村中学', style='Intense Quote Char')
run1.font.size = Pt(52)
cell1.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
cell1.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
cell2.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.BOTTOM
cell1.width = Pt(130)
cell2.width = Pt(300)
h0 = doc.add_paragraph('Resort Middle School', style='Subtitle')
doc.add_paragraph()
h1 = doc.add_heading('期末总结报告', level=2)
h0.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
h1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
h0.style.font.size = Pt(25)
h1.style.font.size = Pt(30)
for x in range(6):
doc.add_paragraph()
p1 = doc.add_paragraph('学年:2022-2023学年')
p2 = doc.add_paragraph('班级:01基础班')
p3 = doc.add_paragraph('班主任:春花老师')
p1.style.font.name = '宋体'
r = p1.style._element.rPr.rFonts
r.set(qn('w:eastAsia'), '黑体')
p1.style.font.size = Pt(13)
p1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
p2.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
p3.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
for x in range(3):
doc.add_paragraph()
p4 = doc.add_paragraph('日期:2023年01月26日')
p4.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
#-------------------------报告正文---------------------------------
h1 = doc.add_heading('度假村中学期末报告', level=1)
h1.style.font.size = Pt(20)
h1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
ph1 = doc.add_paragraph('我校期末考试在全体老师的共同努力下,已经圆满地结束。各位教师也已经按照学校的要求对学科教学进行了分析和总结,找差距,找不足,以便在今后的教学中进行修正和改进。教师、学生和家长对期末考试也很看重。教师要了解自己的教学情况;学生想知道自己学得怎样,家长渴望了解孩子的在校学习状况。同时从教学管理角度看,通过考试可以了解半学期的教与学情况,对后半学期的教学有借鉴、参考、指导作用,所以学校对期中考试每个环节均作了认真组织和精心安排。现就期中考试的前后工作进行总结与反思:')
ph1.style.font.name = '宋体'
r = ph1.style._element.rPr.rFonts
r.set(qn('w:eastAsia'), '宋体')
ph1.paragraph_format.first_line_indent = Pt(25)
h2 = doc.add_heading('一、学生期末基本成绩状况',level=2)
h2.style.font.size = Pt(15)
table = doc.add_table(49, 4, style = 'Medium List 2 Accent 5')
wb = openpyxl.load_workbook('files/学生信息.xlsx')
name = wb.sheetnames
print(name)
sheet1 = wb['students']
m_c = sheet1.max_column
m_r = sheet1.max_row
count = 1
sum = 0
count1 = 1
max_score = sheet1.cell(2, m_c).value
for r in range(1, m_r):
score = sheet1.cell(r+1, m_c).value
sum += score
count += 1
if score > max_score:
max_score = score
if score >= 60:
count1 += 1
score1 =max_score
stu_sum = count
a_score = round(sum/count, 2)
p_score = round(count1/count * 100, 2)
for col in range(1, m_c+1):
for row in range(1, m_r+1):
cell = sheet1.cell(row, col).value
cell1 = table.cell(row-1, col-1)
cell1.text = str(cell)
doc.add_paragraph()
ph2 = doc.add_paragraph('最高分:'+str(score1))
ph3 = doc.add_paragraph('总人数:'+str(stu_sum))
ph4 = doc.add_paragraph('平均分:'+str(a_score))
ph5 = doc.add_paragraph('及格率:'+str(p_score))
h3 = doc.add_heading('二、反思建议',level=2)
ph6 = doc.add_paragraph('有许多教师、同学在期末考试后,往往只是关注于考试成绩而忽略了更为重要的考后反思工作我以为:无论考试成绩优或劣,考试后都要认真地进行总结,因为只有这样,师生才能找到考好或是考得不好的原因。找到了问题的根结,在今后的教、学中就会更有利于自己发挥优点,改正缺点,从而在之后的考试中发挥出优异水平,所以说考后自我反省的意义一点都不亚于考试本身。')
ph6.paragraph_format.first_line_indent = Pt(25)
h4 = doc.add_heading('三、结语', level=2)
ph7 = doc.add_paragraph('期末考毕竟只是一次阶段性的诊断测试,不能将其结果“夸大化”和“绝对化”,家长和老师应该帮助学生剖析期末考试成败的原因。')
ph7.paragraph_format.first_line_indent = Pt(25)
ph8 = doc.add_paragraph('最后,祝大家假期愉快!')
doc.save('files/期末报告.docx')
设计好的word文档: