一、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'
文字对齐(CENTER、LEFT、RIGHT、JUSTIFY)
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 设置单元格样式
设置垂直对齐方式(TOP、BOTTOM、CENTER)
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)
设置水平对齐方式(LEFT、RIGHT、CENTER、JUSTIFY)
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页