使用Python-docx库生成Word文档

一、python-docx

python-docx是第三方库,第一次使用时需要安装,安装库名python-docx,导入模块名docx,可处理docx文档,不支持doc文档。

安装方法

pip install python-docx

导入方法

from docx import Document

常用单位转换函数

Pt—磅值、Mn—毫米、Cm—厘米、Inches—英寸(吋)、RGBColor—RGB颜色

from docx.shared import Pt, Mm, Cm, Inches, RGBColor

1. 基本概念

1.1 Document对象(文档对象) ——代表一个word文件

1.2 heading(标题)

1.3 paragraph(段落)——一个段落(一段文字)

1.4 run——多个run可以拼成一个段落,不同的run可以单独设置不同的样式

1.5 table(表格)——多行多列的表格

1.6 picture(图片)——文档中插入的图片

2. 操作word文档

2.1 创建空的word文档

doc = Document()

2.2 添加标题

Document对象.add_heading(标题内容,level=1)

level的取值范围是:1 ~ 9,如果是0表示大标题Title

h1 = doc.add_heading('数据分析报告', level=1)      # 添加一个一级标题

2.3 添加段落

Document对象.add_paragraph(段落内容)

2.3.1 直接添加整个段落文字

p1 = doc.add_paragraph('段落文字置于此处')

h2 = doc.add_heading('一、主要景点', level=2)

2.3.2 分段添加段落问题

段落对象.add_run(内容)

p2 = doc.add_paragraph('总人数:')

run = p2.add_run('38人')

run.font.color.rgb = RGBColor(255, 0, 0)

p3 = doc.add_paragraph()

run1 = p3.add_run('其中优秀: ')

run2 = p3.add_run('5人')

run3 = p3.add_run(',优秀率')

run4 = p3.add_run('13.2%')

添加分页(换页)

doc.add_page_break()

h3 = doc.add_heading('二、配套设施', level=2)

h4 = doc.add_heading('(一)酒店', level=3)

2.4 添加表格

Document对象.add_table(行数, 列数)

table = doc.add_table(3, 3, style="Light Grid")           # 3行3列表格

table.cell(0, 0).text = '景点'

table.cell(0, 1).text = '介绍'

table.cell(1, 0).text = '描述'

2.5 添加图片

doc.add_paragraph()

如果添加图片的时候没有设置宽高,图片按照原图大小显示

doc.add_picture(‘d:/三步两爿桥.png', width=Cm(13))   # 13厘米

doc.add_picture(‘d:/千年古银杏.jpg', width=Cm(13))

2.6 保存word文档

doc.save('文件名.docx')

二、单独设置内容样式

from docx import Document

from docx.shared import Pt, Cm, Inches, RGBColor

from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

doc = Document()

1. 标题字体相关样式

h1 = doc.add_heading(level=1)

run = h1.add_run('梅花洲景区介绍')

设置标题的字体大小

h1.style.font.size = Pt(25) # 设字体大小为25磅,1磅=1/72吋,1吋=2.54厘米

设置文字颜色

h1.style.font.color.rgb = RGBColor(97, 197, 84)          # RGB(97, 197, 84)è'#61c554'

文字对齐(CENTERLEFTRIGHTJUSTIFY)

h1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

设置字体名称(标题的字体名称不能直接设置到标题对象上,需要设置到提供内容的run对象上)

run.font.name = '楷体'

注意:英文字体对应的字体名可以直接设置; 如果是中文字体名称,必须加上下面这段代码才会有效

注意:中文字体,必须先使用,再设置有效性

from docx.oxml.ns import qn

r = run._element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')

h1 = doc.add_heading(level=2)

run = h1.add_run('hello world!')

run.font.name = 'Calibri'

2. 段落字体相关样式

p1 = doc.add_paragraph('段落文字置于此处')

注意:如果直接设置段落对象相关样式,样式会作用于整个文档中所有的段落

p1.style.font.size = Pt(15)                 # 设置字体大小为15磅

p1.style.font.color.rgb = RGBColor(75, 0, 130)     # 设置字体颜色为'#4b0082'

p1.style.font.bold = True                   # 是否加粗,True加粗,False正常

p1.style.font.italic = True                  # 是否倾斜,True倾斜,False正常

p1.style.font.name = '宋体'             # 设置字体名称

r = p1.style._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

p1.style.font.underline = True         # 添加下划线

p1.style.font.strike = True                 # 添加中划线(删除线)

p1.style.font.shadow = True            # 添加阴影效果

3. 间距相关样式

注意:间距相关样式,只会作用于当前段落对象

p1.paragraph_format.line_spacing = 1.5                      # 设置行间距(1.5倍)

p1.paragraph_format.space_before = Pt(12)              # 段前间距(12磅)

p1.paragraph_format.space_after = Pt(12)                  # 段后间距(12磅)

p1.paragraph_format.first_line_indent = Pt(30)         # 首行缩进(30磅)

注:不能直接设置2字符,2字符=字体大小*2(磅值)

h2 = doc.add_heading('二、配套设施', level=2)

4. 通过run添加样式

p2 = doc.add_paragraph('总人数:')

p2.style.font.bold = True

run = p2.add_run('38人')

run.font.color.rgb = RGBColor(255, 0, 0)

p3 = doc.add_paragraph()

run1 = p3.add_run('其中优秀: ')

run1.font.bold = True

run2 = p3.add_run('5人')

run2.font.size = Pt(18)

run3 = p3.add_run(',优秀率')

run3.font.italic = True

run4 = p3.add_run('13.2%')

run4.font.color.rgb = RGBColor(0, 0, 200)

print(p3.runs)

段落对象.runs——获取构建整个段落的所有的run对象, 返回列表

直接创建段落对象的时候,会自动在段落中创建段落内容对应的run对象

p4 = doc.add_paragraph('段落内容置于此')

p4.runs[0].font.size = Pt(15)

p4.runs[0].font.color.rgb = RGBColor(70, 130, 180)

p4.runs[0].font.underline = True

h4 = doc.add_heading('(一)成绩分布', level=3)

table = doc.add_table(3, 3)

table.cell(0, 0).text = '课程'

table.cell(0, 1).text = '成绩'

table.cell(1, 0).text = '优秀'

doc.add_paragraph()

doc.add_picture(‘d:/img1.png', width=Cm(13))

doc.add_picture(‘d:/liubei.jpg', width=Cm(13))

doc.save(‘文件名1.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

表格基本概念:table(表格)row()

doc = Document()

1. 表格

1.1创建一个表格

table = doc.add_table(3, 3, style="Light Shading Accent 4")

table.cell(2, 0).text = '测试'

table.cell(0, 0).text = '姓名'

table.cell(0, 1).text = '课程'

table.cell(0, 2).text = '分数'

table.cell(1, 0).text = '张三'

table.cell(1, 1).text = 'Python程序设计'

table.cell(1, 3).text = '90'

1.2添加行列

table.add_row()                          # 在最下面添加一行

table.add_column(Pt(100))      # 在最右边添加一列(宽度100磅)

1.3 设置表格样式

设置表格样式,会作用于整个表格中所有的单元格

table.style.font.size = Pt(15)    # 表格文字大小15磅

table.style.font.color.rgb = RGBColor(223, 178, 56)           # 颜色'#dfb238'。↓居中

table.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

2.行列对象

print(table.rows)                         # 获取所有的行(返回所有的行对象)

print(table.columns)                  # 获取所有的列

3. 单元格对象

3.1获取单元格

cell1 = table.cell(0, 0)

cell2 = table.cell(0, 1)

cell3 = table.cell(1, 1)

cell4 = table.cell(2, 2)

cell5 = table.cell(1, 2)

3.2修改单元格内容

cell1.text = 'Name'

cell4.text = '95'

print(cell5.paragraphs)                              # 段落对象

p = cell5.paragraphs[0]

r1 = p.add_run('100')

r2 = p.add_run('分')

r2.font.color.rgb = RGBColor(255, 0, 0)

3.3 合并单元格(只能列合并)

cell11 = table.cell(3, 1)

cell22 = table.cell(3, 2)

cell33 = table.cell(3, 3)

cell11.merge(cell22)

cell11.merge(cell33)

3.4 设置单元格样式

设置垂直对齐方式(TOPBOTTOMCENTER)

cell1.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER

p1 = cell1.paragraphs[0]

run1 = p1.runs[0]

设置字体

run1.font.color.rgb = RGBColor(200, 10, 10)

run1.font.size = Pt(20)

设置水平对齐方式(LEFTRIGHTCENTERJUSTIFY)

p1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT. JUSTIFY

四、实例:梅花洲景区介绍(文字、图片、表格)

##################################################
# 设计 Zhang Ruilin        创建 2020-05-03 22:10 #
#                          修订 2023-01-08 12:45 #
# Python-docx 模块生成 Word 文档,含标题、图文表 #
##################################################
from docx import Document					# docx是Python的Word模块,
from docx.shared import Pt					# 第一次使用需安装Python-docx
from docx.shared import Inches
from docx.shared import Cm
from docx.oxml.ns import qn
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.enum.text import WD_ALIGN_PARAGRAPH

document = Document()						# 打开文档
# 加入不同等级的标题
document.styles['Normal'].font.name='楷体'			# 给段落(正文)设字休
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
run=document.add_heading('',level=0).add_run('梅花洲景区介绍')
run.font.name='微软雅黑'					# 给标题设字体
_title = document.styles['Title']				# level=0相当于styles['Title']
_title.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER	# 标题居中
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
paragraph = document.add_paragraph('梅花洲,位于浙江嘉兴市南湖区凤桥镇。南朝定宋'\
            '永初三年时间石佛寺建于此,因形成五瓣状,其间草木葱郁、曲径通幽、大小'\
            '河流穿梭潆洄犹如梅花,故名梅花洲。已有1500多年历史。经历了15个世纪的'\
            '风雨沧桑,梅花洲地块河道肌理依旧保存完好,堪称奇迹。')	# 添加文本
paragraph.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY	# 两端对齐
paragraph.paragraph_format.first_line_indent =Pt(22)			# 首行缩进22磅
paragraph = document.add_paragraph('梅花洲,一个承载着灿烂文明的千年历史遗迹,因'\
            '大小河道曲折潆绕、纵横交错,将地势惟妙地分成五瓣,状若梅花,故有“梅花洲”'\
            '之名。景区距上海、杭州、苏州、宁波都只有百余里,具有得天独厚的区域位置。')
paragraph.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
paragraph.paragraph_format.first_line_indent =Pt(22)
run=document.add_heading('',level=1).add_run('1.主要景点')		# level=1~9为1~9级标题
run.font.name='黑体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
document.add_paragraph('石佛古刹钟声袅袅、余音不绝', style='List Number')
document.add_paragraph('千年银杏遗世独立', style='List Number')	# 增加有序列表
document.add_paragraph('香花廊桥流芳遗梦', style='List Number')
document.add_paragraph('粉墙黛瓦澜景亭亭,写尽了江南这一方盈水间千年不绝的韵味,再现'\
                       '了三百年的中国情怀。', style='List Number')
run = document.add_heading('',1).add_run('2.配套设施')
run.font.name='黑体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
document.add_paragraph('梅洲酒店:景区配套建设的梅洲酒店是凤桥镇首家按四星级标准建造的'\
        '酒店,是集住宿、餐饮、会务、拓展、农业采摘等功能于一身的现代化酒店。',
        style='List Bullet')					# 增加无序列表
document.add_paragraph('会议中心:梅花洲会议中心面积约3000平方米,拥有能同时容纳450人的'\
        '多功能厅一个、能容纳230人的大型会议室一个和中小型会议室各两个。',
        style='List Bullet')
document.add_paragraph('拓展培训:梅花洲拓展培训基地项目全面,涵盖所有拓展训练项目,包'\
        '括高空项目、场地项目、室内项目、定向项目和野外项目等。', style='List Bullet')
document.add_paragraph('农业基地:梅花洲农业基地位于景区北侧,占地面积400亩。基地内农作'\
        '物品种繁多,时刻为您准备着生机勃勃的田园风光,让您亲手垂钓、抓鸡、采摘,并为您'\
        '当场把战利品烹制成美味佳肴。', style='List Bullet')
document.add_paragraph('禅修中心:石佛寺立体禅修堂是亚洲最大的禅修中心之一,可同时容纳'\
        '400人进行禅修活动。', style='List Bullet')
document.add_paragraph('小镇生活:梅花洲,旧时的繁华集市、官宦之地。修复后的西街两边商铺'\
        '林立,商铺二楼道旗上的店名均为西街原有的老字号,重现了当年商业的繁华和民风的淳'\
        '朴。漫步西街,翰林书院、冯氏老宅、千年银杏、石佛古寺、三步两爿桥一一呈现眼前,'\
        '仿佛一段穿越时光之旅,悠远的记忆、旧时的生活渐渐清晰。', style='List Bullet')
document.add_page_break()					# 增加分页
# 增加图像(此处用到图像python_logo.png,请自行添加到脚本所在目录中,或改成您的路径)
document.add_picture('d:/梅花洲.png', width=Cm(15))		# 将图宽度设为15cm

paragraph = document.add_paragraph('表1 特色景点介绍')		# 添加表名称
paragraph.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER	# 两端对齐
table = document.add_table(rows=1, cols=3, style='Table Grid')	# 增加表格
table.style.paragraph_format.alignment=WD_ALIGN_PARAGRAPH.CENTER
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '名称'
hdr_cells[1].text = '简介'
hdr_cells[2].text = '说明'
table.cell(0,0).width=Cm(5)					# 设置列宽
table.cell(0,1).width=Cm(10)					# 设置列宽
table.cell(0,2).width=Cm(5)					# 设置列宽
mlst = [['石佛寺','据史料记载,唐肃宗至德二年,公元757年,乡民在这里挖出四尊笑面相对的'\
    '石佛,当地人出于敬畏之情,造了这座寺庙。寺庙历宋元两朝,屡毁屡建,至明代开始规模'\
    '日渐宏大,曾是江南禅门古刹之一。清末后变得冷清寂寞,尽失往日繁荣。2007年重建古寺。',
    'd:/石佛寺.png'],['千年银杏','石佛寺旁一对传奇的古银杏,一树在河东,一树在河西,一树'\
    '雌,一树雄,两树隔河相望了千年却不能相拥。树高均在29米左右,树干粗壮,枝繁叶茂,需数'\
    '人才能合抱。2002年,嘉兴市南湖区人民政府颁发的古树名木保护牌,鉴定该银杏树树龄已有'\
    '1240多年,是嘉兴最古老的树木之一。','d:/千年古银杏.png'],['三步两爿桥','在浙江省嘉兴'\
    '市南湖区凤桥镇有座千年古刹石佛寺,石佛寺是江南名刹,可惜历代屡立兴废,至20世纪60年代'\
    '已荡然无存,遗址仅存千年古银杏两株、香花桥和三步两爿桥。这座奇特的“三步两爿桥”,建'\
    '造在两条河道的交叉处,呈90度角,就是说从第一座石桥走下去,走三步就可以上第二座石桥,'\
    '所以叫三步两爿桥。爿是当地方言,当地人称一座桥为一爿桥,相当于桥的量词。',
    'd:/三步两爿桥.jpg']]
for i,_row in enumerate(mlst):
    row_cells = table.add_row().cells				# 添一行表格元素
    row_cells[0].text = _row[0]
    row_cells[1].text = '    '+_row[1]
    p = row_cells[1].paragraphs[0]
    p.paragraph_format.alignment =WD_ALIGN_PARAGRAPH.JUSTIFY	# 单元格文字两端对齐
    # 表格中加图片
    row_cells[2].vertical_alignment=WD_ALIGN_VERTICAL.CENTER	# 垂直居中
    run = document.tables[0].cell(i+1, 2).paragraphs[0].add_run()
    run.add_picture(_row[2], width=Inches(2))			# 运行时图片必须存在
#row_cells = table.add_row().cells				# 添一行表格元素
#row_cells[0].vertical_alignment=WD_ALIGN_VERTICAL.CENTER	# 垂直居中
#row_cells[0].text = '三步两爿桥'
#row_cells[1].text = '    在浙江省嘉兴市南湖区凤桥镇有座千年古刹石佛寺,石佛寺是江南'\
#    '名刹,可惜历代屡立兴废,至20世纪60年代已荡然无存,遗址仅存千年古银杏两株、香花'\
#    '桥和三步两爿桥。这座奇特的“三步两爿桥”,建造在两条河道的交叉处,呈90度角,就是'\
#    '说从第一座石桥走下去,走三步就可以上第二座石桥,所以叫三步两爿桥。爿是当地方言,'\
#    '当地人称一座桥为一爿桥,相当于桥的量词。'
#p = row_cells[1].paragraphs[0]
#p.paragraph_format.alignment =WD_ALIGN_PARAGRAPH.JUSTIFY	# 单元格文字两端对齐
# 表格中加图片
#row_cells[2].vertical_alignment=WD_ALIGN_VERTICAL.CENTER	# 垂直居中
#run = document.tables[0].cell(4, 2).paragraphs[0].add_run()
#run.add_picture(r'd:/三步两爿桥.jpg', width=Inches(2))		# 运行时图片必须存在
document.save(r'd:/梅花洲景区介绍.docx')			# 保存文件

五、运行效果

图1 运行结果第1页

图2 运行结果第2页

物联沃分享整理
物联沃-IOTWORD物联网 » 使用Python-docx库生成Word文档

发表评论