20230217 Python操作word

本文介绍了如何使用python-docx库创建和操作Word文档,包括添加标题、正文、换页、表格、图片,以及设置字体样式、段落样式和表格样式。此外,还展示了如何从Excel数据生成Word版学生成绩分析报告。
摘要由CSDN通过智能技术生成

一、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')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值