目录
[2.1 组成结构讲解](#2.1 组成结构讲解)
[2.2 段落run对象的切分标准](#2.2 段落run对象的切分标准)
[4.1 通过add_paragraph与add_run参数添加样式](#4.1 通过add_paragraph与add_run参数添加样式)
[4.2 单独设置文本样式](#4.2 单独设置文本样式)
[7.1 向新文档任意位置添加图片](#7.1 向新文档任意位置添加图片)
[7.2 向已有文档添加图片](#7.2 向已有文档添加图片)
[8.1 添加单个单元格](#8.1 添加单个单元格)
[8.2 批量填充表格](#8.2 批量填充表格)
[8.3 添加行列](#8.3 添加行列)
[8.4 合并单元格](#8.4 合并单元格)
一、环境安装
bash
pip install -U python-docx==0.7.4
二、文档各组成结构获取
2.1 组成结构讲解
Word文档的组成结构:
- .docx文档
- 段落
- 内容
python-docx使用说明: 和纯文本相比,.docx文件有很多结构。这些结构在python-docx中有三种不同的类型来表示。在最高一层,Document对象表示整个文档。Document对象包含一个Paragraph对象的列表,表示文档中的段落(用户在Word文档中输入时,如果按下回车,新的段落就开始了)。每个Paragraph对象都包含一个Run对象的列表。

python
import docx
# 基于Document方法读取word文档
doc = docx.Document('./demo.docx')
# 获取指定段落
print(doc.paragraphs[0].text) # 我正在学习Python数据分析。
print(doc.paragraphs[0].runs[0].text) # 我正在学习Python数据分析。
2.2 段落run对象的切分标准

python
import docx
# 基于Document方法读取word文档
doc = docx.Document('./demo.docx')
# 获取指定段落
print(doc.paragraphs[0].text) # 我正在学习Python数据分析。
print(doc.paragraphs[2].runs[0].text) # Python是世界上最好的语言,
print(doc.paragraphs[2].runs[1].text) # 你觉得呢?
print(doc.paragraphs[4].runs[0].text) # A plain paragraph with some
print(doc.paragraphs[4].runs[1].text) # bold
print(doc.paragraphs[4].runs[2].text) # and some
print(doc.paragraphs[4].runs[3].text) # italic
总结:
- 中文段落中,是以标点符号进行run的构建/切分
- 英文段落中,是以单词样式不同进行构建/切分,如这个例子,bold是加粗了,italic是斜体了。
三、获取整篇文档内容
如果你只关心Word文档中的文本,不关心样式信息,就可以利用getText()函数。它接受一个.docx文件名,返回其中文本的字符串,当然getText()函数需要自己实现。
python
import docx
def getText(filename):
doc = docx.Document(filename)
fullText = []
for para in doc.paragraphs:
fullText.append(para.text)
return '\n'.join(fullText)
print(getText('./demo.docx'))

四、写入指定样式的数据
4.1 通过add_paragraph与add_run参数添加样式
python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
# 添加段落内容
p1 = dc.add_paragraph(text='i am a student!i love reading!', style='Heading1')
p2 = dc.add_paragraph(text='i am a worker!i love Python!', style='Heading5')
# 添加内容
p2.add_run(text='我是内容1')
p2.add_run(text='我是内容2', style='QuoteChar')
dc.save('./new_word.docx')

4.2 单独设置文本样式
python
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
# 创建一个全新的文档对象
document = Document()
# 添加段落
p = document.add_paragraph()
# 添加内容
run = p.add_run('个人简历')
run.font.size = Pt(26) # 设置字体大小
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
document.save('./new_word.docx')
五、添加标题
- 添加标题
- 调用add_heading()将添加一个段落,并使用一种标题样式
- add_heading()的参数,是一个标题文本的字符串,以及一个从0到4的整数。整数0表示标题是Title样式,这用于文档的顶部。整数1到4是不同的标题层次,1是主要的标题,4是最低层的子标题。add_heading()返回一个paragraph对象,让你不必多花一步从Document对象中提取它。
python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
dc.add_heading('我是标题', 0)
dc.save('./new_word.docx')

六、换行符&换页符
python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
dc.add_paragraph('i am a teacher!')
dc.paragraphs[0].runs[0].add_break() # 添加一个换行符
dc.paragraphs[0].add_run('hello!!!')
dc.add_paragraph('i am a student!')
dc.save('./new_word.docx')

python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
dc.add_paragraph('i am a teacher!')
dc.paragraphs[0].runs[0].add_break(docx.text.WD_BREAK.PAGE) # 添加一个换页符
dc.paragraphs[0].add_run('hello!!!')
dc.add_paragraph('i am a student!')
dc.save('./new_word.docx')

七、添加图片数据
7.1 向新文档任意位置添加图片

7.2 向已有文档添加图片
注意:向已有文档添加图片不能放在任意位置,只能追加到最后。
python
import docx
# 创建一个全新的文档对象
dc = docx.Document('./new_word.docx')
dc.add_paragraph('i am a teacher!')
dc.add_picture('./python.jpg', width=docx.shared.Inches(3), height=docx.shared.Cm(5))
dc.add_paragraph('i am a student!')
dc.save('./new_word.docx')

八、添加表格
8.1 添加单个单元格
python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
# 创建三行三列的表格
tb = dc.add_table(rows=3, cols=3, style='Light List Accent 3')
# 返回所有行
print(list(tb.rows))
# 返回所有列
print(list(tb.columns))
# 向单元格中添加数据 第一行的第一个单元格
tb.rows[0].cells[0].add_paragraph('hello')
dc.save('./new_word.docx')

8.2 批量填充表格
python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
# 创建三行三列的表格
tb = dc.add_table(rows=3, cols=3, style='Light List Accent 3')
# 批量填充表格
alist = ['泰勒斯', '毕达哥拉斯', '赫拉克利特', '苏格拉底', '柏拉图', '亚里士多德', '伏尔泰', '卢梭', '康德']
i = 0
for row in tb.rows:
for cell in row.cells:
cell.add_paragraph(text=alist[i])
i += 1
dc.save('./new_word.docx')

8.3 添加行列
python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
# 创建三行三列的表格
tb = dc.add_table(rows=3, cols=3, style='Light List Accent 3')
# 添加单个行
tb.add_row()
# 添加单个列
tb.add_column()
dc.save('./new_word.docx')

8.4 合并单元格
python
import docx
# 创建一个全新的文档对象
dc = docx.Document()
# 创建三行三列的表格
tb = dc.add_table(rows=3, cols=3, style='Light List Accent 3')
# 获取第一行第二列的单元格
c1 = tb.cell(0, 1)
# 获取第二行第二列的单元格
c2 = tb.cell(1, 1)
# 合并单元格
c1.merge(c2)
dc.save('./new_word.docx')
