我们使用python-docx来操作word文档,首先是安装:
pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple
然后放两个参考文档:
步骤1
导入docx模块步骤2
创建或读取一个文档对象步骤3
向文档写入内容步骤4
生成docx文件上代码:
# 步骤1
from docx import Document
# 步骤2
document = Document() # 新建文档对象
# document = Document("test.docx") # 读取现有word文档,建立文档对象
# 步骤3
...
# 步骤4
document.save("test.docx") # 保存文档
要求:添加标题,能设置标题的字体、大小、颜色等
上代码:
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
d = Document()
# 第一种设置标题的方式
d.add_heading("一级标题 hello world", level=0)
# 第二种设置标题的方式,此方式还可以设置文本的字体、颜色、大小等属性
run = d.add_heading("", level=1).add_run("二级标题")
# 设置西文字体
run.font.name = u'宋体'
# 设置中文字体
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 设置字体颜色
run.font.color.rgb = RGBColor(255, 55, 55) # 红色
# 设置字体大小
run.font.size = Pt(30)
# 设置下划线
run.font.underline = True
# 设置删除线
run.font.strike = True
# 设置加粗
run.bold = True
# 设置斜体
run.italic = True
# 保存文档
d.save("test.docx")
代码解释:
方法名 | 描述 |
---|---|
add_heading(text="", level=1) |
写入标题,默认标题样式为level1,level范围为0-9 |
add_run(text=None, style=None) |
可以添加文本(包括标题、正文、表格文字等),并且能为其设置字体格式、颜色、大小等属性 |
d = Document()
d.styles['Normal'].font.name = u'宋体'
d.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
run = d.add_heading("", level=3).add_run("三级标题")
run.font.name = u'宋体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
run.font.size = Pt(30)
设置字体大小,Pt表示磅,与字号对应关系如下:
号数 | 磅值 (Pt) |
---|---|
初号 | 42 |
小初 | 36 |
一号 | 26 |
小一 | 24 |
二号 | 22 |
小二 | 18 |
三号 | 16 |
小三 | 15 |
四号 | 14 |
小四 | 12 |
五号 | 10.5 |
小五 | 9 |
六号 | 7.5 |
小六 | 6.5 |
七号 | 5.5 |
八号 | 5 |
上代码
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
d = Document()
# 设置全局属性
d.styles['Normal'].font.size = Pt(20)
d.styles['Normal'].font.name = u'Times New Roman'
d.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
# 新增一个段落
p1 = d.add_paragraph("这是第一个段落:")
# 继续添加文字
run = p1.add_run("段落中的文字")
run.font.size = Pt(10.5)
run.font.name = u'宋体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 有序列表
d.add_paragraph("有序列表1111", style="List Number")
d.add_paragraph("有序列表2222", style="List Number")
# 无序列表
d.add_paragraph("无序列表3333", style="List Bullet")
d.add_paragraph("无序列表4444", style="List Bullet")
# 引用
d.add_paragraph("引用5555", style="Intense Quote")
# 在段落p1前添加一个段落
p1.insert_paragraph_before("在段落p1前添加一个段落,我才是第一个段落")
# 增加分页
d.add_page_break()
# 添加一个段落
p2 = d.add_paragraph("我是新分页中的段落")
# 新分页中文字首行缩进两个字
p2.paragraph_format.first_line_indent = Pt(20) * 2
d.save("1111.docx")
代码解释:
方法名 | 描述 |
---|---|
add_paragraph(text="", style=None) |
1、插入段落,通过style可以设置插入段落的类型 2、 List Number 表示有序段落3、 List Bullet 表示无序段落4、 Intense Quote 表示引用 |
insert_paragraph_before(text=None, style=) |
插入段落到现有段落之前 |
add_page_break() |
新增分页,后续的内容会出现在新的分页中 |
add_run()
对象设置新的字体paragraph_format.first_line_indent
属性可以设置缩进大小为当前字体大小的2倍上代码
from docx import Document
from docx.shared import Pt, Inches
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
d = Document()
d.styles['Normal'].font.size = Pt(20)
d.styles['Normal'].font.name = u'Times New Roman'
d.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
p = d.add_paragraph("《静夜思》"
"床前明月光,"
"疑似地上霜。"
"举头望明月,"
"低头思故乡。")
# 设置对齐格式
# 可选项有LEFT、CENTER、RIGHT、JUSTIFY、DISTRIBUTE等
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
# 设置段落缩进
d.add_paragraph("右缩进,0.5英寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸").paragraph_format.right_indent = Inches(0.5)
d.add_paragraph("左缩进,20磅").paragraph_format.left_indent = Pt(20)
d.add_paragraph("首行缩进2个字符").paragraph_format.first_line_indent = Pt(20) * 2
# 设置段落间距 1.5倍行间距 1.5, 单倍行间距 1.0
d.add_paragraph("line_spacing设置为浮点数,表示行间距为行高的倍数").paragraph_format.line_spacing = 1.5
d.add_paragraph("line_spacing设置为具体的长度值,表示绝对距离").paragraph_format.line_spacing = Pt(50)
d.add_paragraph("space_before表示段前间距").paragraph_format.space_before = Pt(100)
d.add_paragraph("space_after表示段后间距").paragraph_format.space_after = Pt(30)
# 设置段落内部文字在遇到需分页情况时处理状态
p2 = d.add_paragraph("很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落")
p2.paragraph_format.keep_together = True # 段中不分页
p2.paragraph_format.keep_with_next = True # 与下段同页
p2.paragraph_format.page_break_before = True # 段前分页
p2.paragraph_format.widow_control = True # 孤行控制
d.save("11111.docx")
WD_PARAGRAPH_ALIGNMENT
有多个可选项
LEFT
表示左对齐CENTER
表示居中对齐RIGHT
表示右对齐JUSTIFY
表示两端对齐DISTRIBUTE
表示散列对齐add_paragraph()
对象可以设置paragraph_format
的多种属性,包括:
alignment
right_indent
left_indent
first_line_indent
space_before
space_after
line_spacing
keep_together
keep_with_next
page_break_before
widow_control
keep_together
段中不分页keep_with_next
与下段同页page_break_before
在段落前增加分页符widow_control
孤行控制,控制页面的孤行和孤立行上代码:
from docx import Document
d = Document()
t = d.add_table(rows=6, cols=4, style="Table Grid")
# 通过行、列来确定单元格,索引从0开始
cell = t.cell(0, 0)
cell.text = "第1行第1列"
# 获取第2行
rows = t.rows[1]
for cell in rows.cells:
cell.text = f"第2行第..列"
# 获取第3列
cols = t.columns[2]
for cell in cols.cells:
cell.text = f"第3列第..行"
# 增加行、增加列
for cell in t.add_row().cells:
cell.text = "新增行"
t.add_column(cell.width)
d.save("ttt.docx")
代码解释:
方法名 | 描述 |
---|---|
add_row() |
新增1行 |
add_column(width) |
新增1列,width列宽必须指定 |
add_table(rows, cols, style=None) |
添加表格的方法,rows、cols为必填,style表示表格的样式,常用Table Grid ,未赋值情况下表格为虚线,其他style样式如下: |
t.cell(row, col)
获取具体的单元格,索引从0开始rows = t.rows[0]
或columns = t.colums[0]
获取行或列,然后通过获取到的行rows.cells[0]
或列columns.cells[0]
获取具体的单元格cell.text = str(i)
i表示数字上代码:
from docx import Document
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
d = Document()
t = d.add_table(rows=5, cols=6, style="Table Grid")
# 首行设置背景色
rows = t.rows[0]
for cell in rows.cells:
shading_elm = parse_xml(r' '.format(nsdecls('w')))
cell._tc.get_or_add_tcPr().append(shading_elm)
# 合并单元格
a = t.cell(1, 0)
a.text = '111'
b = t.cell(2, 1)
b.text = '222'
b.merge(a)
# 往合并单元格中写入
e = t.cell(3, 3)
f = t.cell(4, 4)
e.merge(f)
cell = t.cell(3, 4)
cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 水平居中
cell.paragraphs[0].add_run("合并单元格写入")
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER # 垂直居中
d.save("tttt.docx")
代码解释:
fill="D9D9D9"
可以在http://tool.chinaz.com/Tools/PageColor.aspx中找你需要的颜色进行替换(3, 3)
和(4, 4)
之间的单元格,那么可以通过(3, 3)(3, 4)(4, 3)(4, 4)
定位这个合并后的单元格WD_CELL_VERTICAL_ALIGNMENT
可以设置为如下几种:
TOP
文本与单元格的上边框对齐CENTER
文本与单元格的中心对齐BOTTOM
文本与单元格的底部边框对齐cell = t.cell(3, 4)
cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 水平居中
cell.paragraphs[0].add_run("合并单元格写入")
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER # 垂直居中
上代码:
from docx import Document
from docx.shared import Pt, Inches
d = Document()
d.add_picture("test.png", Inches(5))
d.add_picture("test.png", Pt(200))
d.save("ppp.docx")
代码解释:
方法名 | 描述 |
---|---|
add_picture(image_path_or_stream, width=None, height=None) |
添加图片函数,如果没有指定width和height,会将原图添加到文档中。有指定则会按比例缩放。 |
暂时没用到,需要可以参考下面的文章
参考文章: