一、基础内容
安装第三方库的时候安装:python-docx
from docx import Document
Pt - 像素、Cm - 厘米、Inches - 英寸
from docx.shared import Pt, Cm, Inches, RGBColor
1. 基本概念
1)Document对象(文档对象) - 代表一个word文件
2)heading(标题)
3)paragraph(段落) - 一段文字
4) run - 多个run可以拼成一个段落,不同的run可以单独设置不同的样式
5)table(表格) - 多行多列的表格
6)picture(图片) - 文档中插入的图片
2. 操作word文档
1)创建空的word文档
doc = Document()
2) 添加标题
Document对象.add_heading(标题内容,level=1)
level的取值范围是:1 ~ 9,如果是0表示普通段落
h1 = doc.add_heading('数据分析报告', level=1) # 添加一个一级标题
3)添加段落
Document对象.add_paragraph(段落内容)
3.1)直接添加整个段落文字 ```python
p1 = doc.add_paragraph('此次调研数据主要通过问卷发放的形式获取,在紫金港全校范围内开展。样本数据通过简单随机抽样和分层抽样相结合的方法,进行相对广泛的数据采集与调研,选取的样本量较大,获得的数据客观真实。以下为具体的数据分析结果:')
h2 = doc.add_heading('一、总体情况', level=2)
##### 3.2)分段添加段落问题
段落对象.add_run(内容)
p2 = doc.add_paragraph('共发放问卷:')
run = p2.add_run('320 份')
run.font.color.rgb = RGBColor(255, 0, 0)
p3 = doc.add_paragraph()
run1 = p3.add_run('回收问卷: ')
run2 = p3.add_run('296 份')
run3 = p3.add_run(',回收率')
run4 = p3.add_run('92.5%')
添加分页(换页)
doc.add_page_break()
h3 = doc.add_heading('二、样本代表性', level=2)
h4 = doc.add_heading('(一)性别:分布', level=3)
4) 添加表格
Document对象.add_table(行数, 列数)
table = doc.add_table(3, 3, style="Light Grid") # 'Medium Grid'
table.cell(0, 0).text = '性别'
table.cell(0, 1).text = '人数'
table.cell(1, 0).text = '男'
5)添加图片
doc.add_paragraph()
如果添加图片的时候没有设置宽高,图片按照原图大小显示
doc.add_picture('files/img1.png', width=Cm(13))
doc.add_picture('files/liubei.jpg', width=Cm(13))
保存word文档
doc.save('files/demo1.docx')
二、单独设置内容样式
from docx import Document
from docx.shared import Pt, Cm, Inches, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
doc = Document()
1. 字体相关样式
1.1 标题相关样式
h1 = doc.add_heading(level=1)
run = h1.add_run('数据分析报告')
设置标题的字体大小
h1.style.font.size = Pt(25)
设置文字颜色
h1.style.font.color.rgb = RGBColor(97, 197, 84)
文字居中(CENTER、LEFT、RIGHT)
h1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
设置字体名称(标题的字体名称不能直接设置到标题对象上的,需要设置到提供内容的run对象上)
run.font.name = '楷体'
注意:英文字体对应的字体名可以直接设置; 如果是中文字体名称,必须加上下面这段代码才会有效
注意:中文字体,必须先使用,再设置有效性
from docx.oxml.ns import qn
r = run._element.rPr.rFonts
r.set(qn('w:eastAsia'), '楷体')
h1 = doc.add_heading(level=2)
run = h1.add_run('hello world!')
run.font.name = 'Arima Koshi'
### 1.2 段落相关样式
p1 = doc.add_paragraph('此次调研数据主要通过问卷发放的形式获取,在紫金港全校范围内开展。样本数据通过简单随机抽样和分层抽样相结合的方法,进行相对广泛的数据采集与调研,选取的样本量较大,获得的数据客观真实。以下为具体的数据分析结果:')
注意:如果直接设置段落对象相关样式,样式会作用于整个文档中所有的段落
p1.style.font.size = Pt(15) # 设置字体大小
p1.style.font.color.rgb = RGBColor(75, 0, 130) # 设置字体颜色
p1.style.font.bold = True # 是否加粗
p1.style.font.italic = True # 是否倾斜
p1.style.font.name = ‘宋体’ # 设置字体名称
r = p1.style._element.rPr.rFonts
r.set(qn(‘w:eastAsia’), ‘宋体’)
p1.style.font.underline = True # 添加下划线
p1.style.font.strike = True # 添加中划线(删除线)
p1.style.font.shadow = True # 添加阴影效果
1.3 间距相关样式
注意:间距相关样式,只会作用于当前段落对象
p1.paragraph_format.line_spacing = 1.5 # 设置行间距
p1.paragraph_format.space_before = Pt(120) # 段前间距
p1.paragraph_format.space_after = Pt(120) # 段后间距
p1.paragraph_format.first_line_indent = Pt(30) # 首行缩进
h2 = doc.add_heading('一、总体情况', level=2)
#### 1.4 通过run添加样式
p2 = doc.add_paragraph('共发放问卷:')
p2.style.font.bold = True
run = p2.add_run('320 份')
run.font.color.rgb = RGBColor(255, 0, 0)
p3 = doc.add_paragraph()
run1 = p3.add_run('回收问卷: ')
run1.font.bold = True
run2 = p3.add_run('296 份')
run2.font.size = Pt(18)
run3 = p3.add_run(',回收率')
run3.font.italic = True
run4 = p3.add_run('92.5%')
run4.font.color.rgb = RGBColor(0, 0, 200)
print(p3.runs)
h3 = doc.add_heading('二、样本代表性', level=2)
段落对象.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('files/img1.png', width=Cm(13))
doc.add_picture('files/liubei.jpg', width=Cm(13))
doc.save('files/demo2.docx')
三、样式演示
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
doc = Document()
# 1.获取所有已经写好的主题样式
styles = doc.styles
for s in styles:
print(s)
print('------------------------------------------华丽的分割线------------------------------------------------')
# 2. 字符样式 - 设置在run对象上的样式
doc.add_heading('===========1.所有的字符样式名和对应的效果============')
# 获取所有字符相关的样式的名称和显示效果
p1 = doc.add_paragraph()
for s in styles:
# Character
if s.type == WD_STYLE_TYPE.CHARACTER:
run = p1.add_run(f'字符样式名称: {s.name}\n', style=s)
# 使用方法:
p2 = doc.add_paragraph()
p2.add_run('Hello World!', style='Intense Reference')
print('------------------------------------------华丽的分割线------------------------------------------------')
# 3. 段落样式 - 设置在段落对象上的样式
doc.add_heading('===========2.所有段落样式名和对应的效果============')
for s in styles:
if s.type == WD_STYLE_TYPE.PARAGRAPH:
doc.add_paragraph(f'段落样式名称:{s.name}', style=s)
doc.add_paragraph('hello world!', 'Title')
print('------------------------------------------华丽的分割线------------------------------------------------')
# 4. 表格样式 - 设置在表格对象上的样式
for s in styles:
if s.type == WD_STYLE_TYPE.TABLE:
doc.add_paragraph(f'表格样式名称:{s.name}')
doc.add_table(3, 3, style=s)
doc.add_paragraph('\n')
doc.add_table(5, 4, style='Medium Grid 1 Accent 4')
doc.save('files/demo3.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 = 'abc'
table.cell(0, 0).text = '姓名'
table.cell(0, 1).text = '年龄'
table.cell(0, 2).text = '分数'
table.cell(1, 1).text = '19'
table.cell(1, 3).text = '你好'
1.2添加行列
table.add_row() # 在最下面添加一行
table.add_column(Pt(100)) # 在最右边添加一列
1.3 设置表格样式
设置表格样式,会作用于整个表格中所有的单元格
table.style.font.size = Pt(15)
table.style.font.color.rgb = RGBColor(223, 178, 56)
table.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
2.行列对象
print(table.rows) # 获取所有的行(返回一个容器,容器中的元素是所有的行对象)
print(table.columns) # 获取所有的列
遍历获取所有的行
for row in table.rows:
# 获取指定行所有的单元格
print(row.cells)
# 获取指定行的高度
print(row.height)
# 获取指定行的下标(下标值从0开始)
print(row._index)
# 修改每一行的高度
# row.height = Pt(50)
# 单独设置指定行的高度
if row._index == 0:
row.height = Pt(50)
print('------------------------------------------华丽的分割线------------------------------------------------')
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 = '98分'
print(cell5.paragraphs) # [<docx.text.paragraph.Paragraph object at 0x7f81e012a490>]
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)
p1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
doc.save('files/demo4.docx')
五、操作已经存在的word
from docx import Document
1. 打开指定的word文档,创建一个Document对象
doc = Document('files/文档.docx')
2.获取和修改段落内容
2.1 获取段落内容
获取所有段落对象
result = doc.paragraphs
获取某一个段落
p1 = result[0]
获取段落文字内容
print(p1.text)
print(result[1].text)
p3 = result[3]
print(p3.text)
练习:获取共发放问卷的份数
print(p3.text.split(':')[-1])
遍历一个一个获取每一个段落
for p in result:
pass
2.2修改段落内容
2.2.1修改整个段落内容
all_p = doc.paragraphs
p1 = all_p[0]
p1.text = '调研结果报告'
2.2.2 增加内容
p2 = all_p[1]
方法1:
p2.add_run(‘hello world!!’)
方法2:
p2.text = p2.text + ‘hello world!’
p2.text = 'hello world! ' + p2.text
3. 获取和修改表格内容
3.1 获取所有的表格
all_table = doc.tables
print(all_table)
获取指定的一个表格对象
t1 = all_table[0]
修改指定单元格内容
t1.cell(0, 0).text = 'gender'
获取指定单元格内容
print(t1.cell(1, 1).text)
增加行
t1.add_row()
按行获取所有内容
t2 = all_table[1]
获取每一行
all_data = []
for row in t2.rows:
if row._index == 0:
continue
# 获取一行中所有的单元格
cells = row.cells
data = []
for cell in cells:
data.append(cell.text)
all_data.append(data)
print(all_data)
将列表students中的数据以表格的方式添加到word文档中
students = [
['小明', 18, '110', '四川成都'],
['小花', 30, '119', '重庆'],
['张三', 25, '120', '深圳'],
['李四', 26, '134', '杭州'],
['老王', 19, '190', '四川成都']
]
t3 = doc.add_table(len(students)+1, 4, 'Light Shading Accent 4')
students.insert(0, ['姓名', '年龄', '电话', '地址'])
for r_index in range(len(students)):
row_data = students[r_index]
for c_index in range(len(row_data)):
t3.cell(r_index, c_index).text = str(row_data[c_index])
在最后添加段落总结学生情况:“总共xx学生,平均年龄:xx岁!”
count = len(students)-1
total_age = 0
for stu in students[1:]:
total_age += stu[1]
doc.add_paragraph(f'总共{count}学生,平均年龄:{total_age/count}岁!')
doc.save('files/文档操作完.docx') #保存在一个新的文件中
本文含有隐藏内容,请 开通VIP 后查看