一、Word文档基本内容
注意:安装第三方库的时候 装:python-docx
from docx import Document
1.创建空白的word文档
doc = Document()
2.添加标题
文档对象.add_heading(标题内容, level=级别)
级别范围:1 ~ 9, 0(其中0代表正文)
doc.add_heading('一级标题', level=1)
3.添加正文
文档对象.add_paragraph(正文内容, style=None)
doc.add_paragraph('\t在现实生活中,报告使用的频率越来越高,报告具有语言陈述性的特点。那么一般报告是怎么写的呢?以下是小编为大家整理的数据分析报告,供大家参考借鉴,希望可以帮助到有需要的朋友。')
4.添加换页
doc.add_page_break()
doc.add_paragraph('\t回顾20xx,这是不平静的一年,酒店旅游行业发生了众多事情。酒店之间收购之战,当酒店产品被迫下架;当OTA控制酒店低价竞争;当酒店支付高佣金低报价;当酒店被OTA逼着选边站队;受伤的总是酒店和客户?新的一年该怎么办?做强直销渠道才是硬道理,无论这个世界怎么变换,OTA怎么折腾,酒店都能在大浪中站稳。')
5.添加表格
5.1 文档对象.add_table(行数, 列数) - 添加表格
5.2 表格对象.cell(行下标, 列下标) - 获取表格中指定的单元格
5.3 单元格对象.text = ‘数据’ - 修改单元格内容
table = doc.add_table(3, 4, style='Table Grid')
cell1 = table.cell(0, 0)
cell1.text = '姓名'
6.添加图片
文档对象.add_picture(‘图片地址’, width=None, height=None)
doc.add_picture('files/MetalSlug169.gif')
7.保存文档
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()
设置文档默认字体为’等线’
style = doc.styles['Normal']
style.font.name = '等线'
style._element.rPr.rFonts.set(qn('w:eastAsia'), '等线')
=标题==
1.创建标题
h1 = doc.add_heading(level=1)
1.1 让标题在文档中居中显示
h1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
1.2 设置标题字体大小
h1.style.font.size = Pt(20)
1.3 设置标题文字颜色
h1.style.font.color.rgb = RGBColor(95, 158, 160)
1.4 设置标题的字体
run1 = h1.add_run('数据分析报告1')
run1.font.name = '宋体'
注意:如果使用中文字体,须先注册
run1._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
=段落==
注意:设置在某一个段落上的样式会同步到全文所有段落上
2.创建段落
p1 = doc.add_paragraph('\t回顾20xx,这是不平静的一年,酒店旅游行业发生了众多事情。酒店之间收购之战,当酒店产品被迫下架;当OTA控制酒店低价竞争;当酒店支付高佣金低报价;当酒店被OTA逼着选边站队;受伤的总是酒店和客户?新的一年该怎么办?做强直销渠道才是硬道理,无论这个世界怎么变换,OTA怎么折腾,酒店都能在大浪中站稳。')
2.1 设置字体名称
p1.style.font.name = '宋体'
注意:如果使用中文的字体,须先注册
p1.style._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
2.2 设置字体大小
p1.style.font.size = Pt(15)
2.3 设置字体颜色
p1.style.font.color.rgb = RGBColor(33, 158, 100)
2.4 设置字体加粗(全局属性,慎重添加)
p1.style.font.bold = True
2.5 设置字体倾斜(全局属性,慎重添加)
p1.style.font.italic = True
2.6 字体添加下划线(全局属性,慎重添加)
p1.style.font.underline = True
2.7 字体删除样式(全局属性,慎重添加)
p1.style.font.strike = True
2.8 字体阴影效果(全局属性,慎重添加)
p1.style.font.shadow = True
=段落中run的用法==
给word文档提供文字内容的时候有两种方式:
1.直接提供文字内容:doc.add_heading()、doc.add_paragraph()
2.通过run对象提供文字内容
h2 = doc.add_heading()
run2 = h2.add_run('二、中国酒店移动互联网1月份(典型)运营数据分析')
p2 = doc.add_paragraph()
run3 = p2.add_run('\t(一)20xx年1月米订MSS酒店运营数据排名TOPxx(按照当月订单量排序)\n')
run4 = p2.add_run('\t分析:\n')
run5 = p2.add_run('\t1、数据显示,TOPxx中月订单都超过了300单。订单排名方面;海门东恒盛以xx46单位居第一;湖北星球国际大酒店以1147单位列第二;好逸smart酒店(春熙店)以835单获得第三名。')
p3 = doc.add_paragraph('\t2、排名榜中酒店类型有高星级酒店也有中档酒店、经济型酒店,说明移动端营销适合各类型酒店。数据显示:20xx年1月份会员新增量排名情况是,张家港沙洲湖酒店以671人获得第一名;南昌瑞颐大酒店和合肥辰茂和平酒店分别以380人、226人分获第二名、第三名。数据显示前五名的会员增长人数超过100人。其中速8酒店上海松江车墩影视城店以xx2人位列第四名,作为一家经济连锁酒店,有与其他大牌星级酒店相比,有后来者居上的潜力和趋势。')
p4 = doc.add_paragraph('\t3、从总订单量及会员重购率来看,排行榜中有60%的酒店会员重购率超过10%,说明移动端用户会员消费习惯培养成熟后,更容易提升会员重购率,培养忠诚客户。')
2.9 段落内部行间距
p3.paragraph_format.line_spacing = 2
2.10 段前距离
p3.paragraph_format.space_before = Pt(50)
2.11 段后距离
p3.paragraph_format.space_after = Pt(50)
2.12 行首缩进
p3.paragraph_format.first_line_indent = Pt(50)
保存文档
doc.save('files/demo2.docx')
三、设置文档主题样式
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.style import WD_STYLE_TYPE, WD_BUILTIN_STYLE
doc = Document()
styles = doc.styles
主题样式有三种:基于run、基于paragraph、基于table的主题样式
1.基于run的主题样式(标题)
1.1 用法
h1 = doc.add_heading(level=1)
h1.add_run('run标题样式demo1', style='Subtle Reference')
p1 = doc.add_paragraph()
p1.add_run('run段落样式demo2', style='Title Char')
1.2 获取所有的run相关的主题样式的名称
doc.add_heading('1.基于run添加的所有主题名称对应的样式:')
for x in styles: # 将与run相关的所有主题样式展现出来
# print(x.type, x.name)
if x.type == WD_STYLE_TYPE.CHARACTER:
p = doc.add_paragraph()
p = p.add_run('character(run) style is:' + x.name, style=x.name)
2.基于paragraph(段落)的主题样式
doc.add_paragraph('2.基于paragraph添加的所有主题名称对应的样式:', style='Title')
for x in styles: # 将与paragraph相关的所有主题样式展现出来
if x.type == WD_STYLE_TYPE.PARAGRAPH:
p = doc.add_paragraph('paragraph style is:' + x.name, style=x.name)
3.基于table(表格)的主题样式
doc.add_table(3, 4, style='Table Grid')
doc.add_heading('3.基于table添加的所有主题名称对应的样式:')
for x in styles: # 将与table相关的所有主题样式展现出来
if x.type == WD_STYLE_TYPE.TABLE:
p = doc.add_paragraph('表格主题名称:' + x.name)
p.paragraph_format.space_before = Pt(50)
doc.add_table(3, 4, style=x.name)
4.保存文档
doc.save('files/demo3.docx')
四、表格的使用
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
doc = Document()
设置文档默认字体为’等线’
style = doc.styles['Normal']
style.font.name = '等线'
1.添加表格
table = doc.add_table(3, 4, style='Table Grid')
2.添加行和列
table.add_row() # 在最下面添加1行
table.add_column(Pt(100)) # 在最后添加1列
3.设置单元格内容
3.1 直接给单元格添加内容
cell0 = table.cell(0, 0).text = '项目'
3.2 通过获取单元格的段落对象添加内容
cell1 = table.cell(0, 1)
cell1.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
p1 = cell1.paragraphs[0]
r1 = p1.add_run('价格')
r2 = p1.add_run('(元)')
4.设置表格样式
4.1 直接设置表格样式,会作用于整个表格
table.style.font.size = Pt(20)
table.style.font.color.rgb = RGBColor(111, 111, 111)
table.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
4.2 基于单元格设置样式,必须基于单元格内容对应的run对象来设置
r2.font.color.rgb = RGBColor(255, 0, 0)
5.行高与列宽
rows = table.rows # 获取所有行
cols = table.columns # 获取所有列
for r in rows:
# 获取所有的单元格
# print(r.cells)
# r.cells[0].text = '100'
# 获取行下标
print(r._index)
# 设置行高:行对象.height = Pt()
if r._index == 0:
r.height = Pt(40)
else:
r.height = Pt(25)
# 给每行的每个单元格cell设置垂直居中
for cell in r.cells:
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
print('--------------------')
for c in cols:
# 获取一列中所有的单元格
# print(c.cells)
c.cells[0].text = 'hello'
# 获取列下标
print(c._index)
保存文档
doc.save('files/demo4.docx')
五、作业
五、作业
根据Excel表中原始数据生成一份Word版学生成绩分析报告
import openpyxl
import os
from openpyxl.utils import get_column_letter
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
from docx.oxml.ns import qn # 中文字体须先注册
doc = Document()
# 配置全局默认字体
style = doc.styles['Normal']
style.font.name = '等线'
style._element.rPr.rFonts.set(qn('w:eastAsia'), '等线')
# ---------报告封面----------
cover1 = doc.add_paragraph()
cover1_run = cover1.add_run()
cover1_run.add_picture('files/qf_logo.png', width=Pt(160), height=Pt(41))
cover1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
cover2 = doc.add_paragraph('2022年度学生成绩分析报告')
cover2_run = cover2.runs[0]
cover2_run.font.size = Pt(24)
cover2.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
cover2.paragraph_format.space_before = Pt(220)
cover2.paragraph_format.space_after = Pt(80)
cover3 = doc.add_paragraph('千锋学院')
cover3_run = cover3.runs[0]
cover3.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
cover3_run.font.size = Pt(18)
cover4 = doc.add_paragraph('2023年2月19日')
cover4_run = cover4.runs[0]
cover4.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
cover4_run.font.size = Pt(18)
doc.add_page_break()
# 为新表做准备:获取原始数据
ex1 = openpyxl.open('files/学生信息表.xlsx')
sheet1 = ex1['students']
max_r = sheet1.max_row
max_c = sheet1.max_column
# 在word中创建新表
p0 = doc.add_paragraph('学生成绩表:')
run0 = p0.runs[0]
run0.font.size = Pt(12)
p0.paragraph_format.line_spacing = 1.5
table1 = doc.add_table(max_r, max_c, style='Table Grid')
rows = table1.rows
cols = table1.columns
# 给新表填入数据同时给样式同时判断分数小于60分的标红处理
for r in rows:
col = 1
if r._index == 0:
r.height = Pt(30)
for x in range(len(r.cells)):
if x == 3:
r.cells[x].text = str(sheet1.cell(r._index + 1, 4).value)
p = r.cells[x].paragraphs[0]
run = p.runs[0]
run.font.color.rgb = RGBColor(0, 0, 0)
run.font.bold = True
else:
r.cells[x].text = str(sheet1.cell(r._index + 1, col).value)
p = r.cells[x].paragraphs[0]
run = p.runs[0]
run.font.bold = True
col += 1
else:
r.height = Pt(20)
for x in range(len(r.cells)):
if x == 3:
r.cells[x].text = str(sheet1.cell(r._index + 1, 4).value)
p = r.cells[x].paragraphs[0]
run = p.runs[0]
if int(r.cells[x].text) < 60:
run.font.color.rgb = RGBColor(255, 0, 0)
else:
r.cells[x].text = str(sheet1.cell(r._index + 1, col).value)
p = r.cells[x].paragraphs[0]
run = p.runs[0]
col += 1
for cell in r.cells:
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
table1.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# ---------总人数----------
p1 = doc.add_paragraph('总人数:' + str(max_r-1) + '人')
run1 = p1.runs[0]
p1.paragraph_format.space_before = Pt(40)
run1.font.bold = True
# ---------最高分----------
scores = []
for x in range(2, max_r+1):
cell1 = sheet1.cell(x, 4)
score = int(cell1.value)
scores.append(score)
max_score = scores[0]
count = 0
for x in scores:
if x > max_score:
max_score = x
elif x == max_score:
count += 1
p2 = doc.add_paragraph('最高分:' + str(max_score) + '分,共计:' + str(count) + '人')
run2 = p2.runs[0]
p2.paragraph_format.space_before = Pt(20)
run2.font.bold = True
# ---------平均分----------
aver_score = str(round(sum(scores) / len(scores), 2))
p3 = doc.add_paragraph('平均分:' + aver_score + '分')
run3 = p3.runs[0]
p3.paragraph_format.space_before = Pt(20)
run3.font.bold = True
# ---------及格率----------
a = 0
for x in scores:
if x >= 60:
a += 1
pass_rate = str(a / (max_r-1)).split('.')[0] + '.' + str(a / (max_r-1)).split('.')[1][:2]
p4 = doc.add_paragraph('及格率:' + pass_rate + '%')
run4 = p4.runs[0]
p4.paragraph_format.space_before = Pt(20)
run4.font.bold = True
# ---------报告落款----------
p5 = doc.add_paragraph('千锋学院教务处')
run5 = p5.runs[0]
p5.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
run5.font.size = Pt(12)
p6 = doc.add_paragraph('2023年2月19日')
run6 = p6.runs[0]
p6.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
run6.font.size = Pt(12)
# 保存文档
doc.save('files/学生成绩分析报告.docx')