python-docx - 1
python-docx 用于创建和更新Word文件的python库
1. 安装
pip3 install python-docx -i https://mirrors.aliyun.com/pypi/simple
2. 创建与保存文件
#导入Document
from docx import Document
# 创建一个新文档
doc = Document()
print(type(doc)) # <class 'docx.document.Document'>
# doc=Document("file.docx") 可以打开一个新文档
# 保存文件
doc.save("hello.docx")
3. 标题
from docx import Document
doc = Document()
# 添加标题
# text=内容, level=级别 (1-9)
heading = doc.add_heading(text="1级标题", level=1)
# 返回的是一个段落,说明标题也是段落的一种
print(type(heading)) # <class 'docx.text.paragraph.Paragraph'>
for i in range(2, 10):
doc.add_heading(text=f"{i}级标题", level=i)
doc.save("hello.docx")
4. 段落
4.1 添加段落
from docx import Document
doc = Document()
# 在文档尾添加一个段落,返回这个段落的引用
p1 = doc.add_paragraph(text="第一段")
p2 = doc.add_paragraph(text="第二段")
# 插入段落
p1_5 = p2.insert_paragraph_before("第二段前插入一段")
doc.save("hello.docx")
4.2 指定段落样式
4.2.1 无序列表
from docx import Document
doc = Document()
doc.add_paragraph("三国演义", style="List Bullet")
doc.add_paragraph("红楼梦", style="List Bullet")
p = doc.add_paragraph("西游记")
p.style = "List Bullet"
doc.save("hello.docx")
List Bullet生成一个无序列表。
4.2.2 有序列表
from docx import Document
doc = Document()
for p in ["红楼梦", "三国演义", "西游记", "水浒传"]:
doc.add_paragraph(p, style="List Number")
doc.save("hello.docx")
List Number 生成一个有序列表。
4.3.3 添加一个新样式,并应用这个样式
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt, RGBColor
doc = Document()
# 添加一个段落样式,在word样式中会多出一个my_style的样式
style = doc.styles.add_style('my_style', WD_STYLE_TYPE.PARAGRAPH)
# 设置样式的:字号,字体,颜色
style.font.size = Pt(18)
style.font.name = "Showcard Gothic"
style.font.color.rgb = RGBColor(255, 0, 0)
# 创建并应用段落样式
doc.add_paragraph("Hello world!", style=style)
doc.save("hello.docx")
4.3 段落的对齐方式
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
doc = Document()
p1 = doc.add_paragraph("hello")
# 左对齐
p1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
p2 = doc.add_paragraph("hello")
# 居中对齐
p2.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
doc.save("hello.docx")
对齐方式有:
对齐方式 | 值 | 说明 |
---|---|---|
LEFT | 0 | 左对齐 |
RIGHT | 1 | 右对齐 |
CENTER | 2 | 居中对齐 |
JUSTIFY | 3 | 两端对齐 |
DISTRIBUTE | 4 | 分散对齐 |
4.4 段落的缩进
from docx import Document
from docx.shared import Cm
text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'
doc = Document()
p1 = doc.add_paragraph(text)
# 左缩进二厘米
p1.paragraph_format.left_indent = Cm(2)
doc.save("hello.docx")
缩进的方式有:
缩进 | 说明 |
---|---|
left_indent | 左缩进 |
right_indent | 右缩进 |
first_line_indent | 首行缩进 |
常用单位:
- Cm厘米
- Pt 磅
- Mm 毫米
- Inches 英寸
4.4.1 悬挂缩进在哪里?
首先缩进支持负值,就相当于悬挂缩进了,如:
from docx import Document
from docx.shared import Cm
text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'
doc = Document()
p1 = doc.add_paragraph(text)
# 缩进二厘米(整体向右移动2)
p1.paragraph_format.left_indent = Cm(2)
# 首先缩进-2厘米,首先向左移动2厘米,整体效果就是悬挂缩进
p1.paragraph_format.first_line_indent = Cm(-2)
doc.save("hello.docx")
4.4.2 如何首行缩进2个字符
from docx import Document
from docx.shared import Cm, Pt
text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'
doc = Document()
p1 = doc.add_paragraph(text)
# 先设置字号(三号),之后获取字体对应字号的大小*2 即可
p1.style.font.size = Pt(16)
p1.paragraph_format.first_line_indent = p1.style.font.size * 2
doc.save("hello.docx")
4.5 段落间距(段前,段后)
from docx import Document
from docx.shared import Cm, Pt
text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'
doc = Document()
for i in range(5):
p1 = doc.add_paragraph(text)
# 段前
p1.paragraph_format.space_before = Pt(20)
# 段后
p1.paragraph_format.space_after = Pt(10)
doc.save("hello.docx")
4.6 行距
from docx import Document
from docx.shared import Cm, Pt
text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'
doc = Document()
p = doc.add_paragraph(text)
# 1.5倍行距
p.paragraph_format.line_spacing = 1.5
p = doc.add_paragraph(text)
# 24磅行距
p.paragraph_format.line_spacing = Pt(24)
doc.save("hello.docx")
4.7 分页属性
用于控制段落在页面边界附近的行为
-
keep_together 段中不分页
-
keep_with_next 与下段同页
-
page_break_before 段前分页
-
widow_control 孤行控制
# 这四个属性可以设置为True, False, None
p.paragraph_format.widow_control = True
5. 添加硬分页
当一页没满,希望在另一页继续,则可以添加一个分页符。
from docx import Document
doc = Document()
for i in range(1, 5):
doc.add_paragraph(f"第{i}页")
doc.add_page_break()
doc.save("hello.docx")
6. 字符格式
一个段落可以由多个Run对象组成,每个Run可以设置不同的文本,字体,字号等。
doc = Document()
# 添加一个新段
p = doc.add_paragraph()
# 添加一个Run
run1 = p.add_run('燕子去了,')
run1.font.size = Pt(16)
run1.font.bold = True
# 添加另一个Run
run2 = p.add_run('有再来的时候;')
run2.font.size = Pt(12)
run2.font.color.rgb = RGBColor(255, 0, 0)
doc.save("hello.docx")
6.1 设置字符格式
Run对象提供了Font对象的访问,可以设置字体,字号等。
FONT属性 | 说明 |
---|---|
name | 字体,注意中文字体的问题 |
size | 字号 |
bold | 粗体: True / False |
italic | 斜体: True / False |
double_strike | 双删除线:True / False |
highlight_color | 高亮显示: font.highlight_color = WD_COLOR_INDEX.RED |
shadow | 阴影:True / False |
outline | 外框:True / False |
strike | 删除线:True / False |
subscript | 下标:True / False |
superscript | 上标:True / False |
underline | 下划线:True / False, 还可以枚举样式 |
下划线的样式:WD_UNDERLINE.值
- NONE: 没有
- SINGLE: 单线
- DOUBLE: 双线
- DOTTED:点
- DOTTED_HEAVY:粗点
- WAVY:波浪线
- WAVY_HEAVY:粗波浪线
- WAVY_DOUBLE:双波浪线
from docx import Document
from docx.enum.text import WD_UNDERLINE
text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'
doc = Document()
p = doc.add_paragraph()
run1 = p.add_run(text)
run1.font.underline = WD_UNDERLINE.DOTTED_HEAVY
doc.save("hello.docx")
关于中文字体
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Cm, Pt
doc = Document()
p = doc.add_paragraph()
r = p.add_run("hell 中国")
r.font.name ="隶书"
r.element.rPr.rFonts.set(qn('w:eastAsia'), r.font.name)
r.font.size = Pt(20)
doc.save("hello.docx")
6.2 设置字符颜色
from docx import Document
from docx.shared import RGBColor
text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'
doc = Document()
p = doc.add_paragraph()
run1 = p.add_run(text)
run1.font.color.rgb = RGBColor(255, 0, 255)
doc.save("hello.docx")
RGBColor(红,绿,蓝),习惯十六进制写法,可以写一个转换。
def color(n: int) -> RGBColor:
red = n >> 16
green = n >> 8 & 0x00ff
blue = n & 0x0000ff
return RGBColor(red, green, blue)
7. 制表位
默认情况下,我们在Word文档中每按下一次Tab键,插入点即会自动向右侧移动2个字符的位置,定位到新的位置,这个位置就被称为制表位。(想像有一个无形的网格,按一下跳到下一格)
在word段落面板可以设置制表位:长度,对齐方式(文本相对于制表位的对齐),前导符。
对齐方式:WD_TAB_ALIGNMENT 这里枚举
前导符:WD_TAB_LEADER 这里枚举
from docx import Document
from docx.enum.text import WD_TAB_ALIGNMENT, WD_TAB_LEADER
from docx.shared import Cm
doc = Document()
p = doc.add_paragraph()
# 获取TabStops对象
tab_stops = p.paragraph_format.tab_stops
# 在5厘米的地方添加一个制表位,左对齐,前导符是点
tab_stops.add_tab_stop(Cm(5), WD_TAB_ALIGNMENT.LEFT, WD_TAB_LEADER.DOTS)
# 添加第二个制表位
tab_stops.add_tab_stop(Cm(10))
# 输入数据:注意\t表示按一下tab键
p.add_run("\thelllo")
p.add_run("\tword")
doc.save("hello.docx")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?