Windows用户打开命令行输入:pip install python-docx
Mac用户打开终端/Terminal输入:pip3 install python-docx
导入模块:import docx
如果无法安装,可以转换为国内清华镜像源,Windows系统操作如下:
在cmd模式下输入
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx
注意:一个run对象是相同样式文本的延续,如颜色、字体、粗细、斜体不同,文字加粗
和后面没有加粗操作的,属于不同的文字块。
① python-docx提取文字
doc.paragraphs -> 得到一个列表,包含每个段落实例
len(doc.paragraphs)-> 得到段落的个数
paragraph.text -> 得到该段落的文字内容
import docx
from docx import Document
# 绝对路径写法,为方便阅读,以下都采用相对路径。
# doc = Document(r"C:\Users\Administrator\Desktop\这是一个文档.docx")
doc = Document("这是一个文档.docx")
print("段落数:"+str(len(doc.paragraphs)))
print(len(doc.paragraphs))
#输出第一段的内容,索引从0开始
para = doc.paragraphs[0]
print("第一段的内容是",para.text,sep=':')
print("----------------------------------------------------------------")
#输出每一段的内容
for para in doc.paragraphs:
print(para.text)
print("----------------------------------------------------------------")
#输出段落编号及段落内容
for i in range(len(doc.paragraphs)):
print("第"+str(i)+"段的内容是:"+doc.paragraphs[i].text)
paragraph.runs -> 得到一个列表,包含每个文字块
run.text -> 得到该文字块的文字内容
import docx
from docx import Document
doc = Document("这是一个文档.docx")
#输出第一段第一个文字块的内容,索引从0开始
para1 = doc.paragraphs[0]
runs = para1.runs[0]
print("第一段第一个文字块的内容是",runs.text,sep=':')
print("----------------------------------------------------------------")
for i in range(len(doc.paragraphs)):
paragraph = doc.paragraphs[i]
runs = paragraph.runs
for run in paragraph.runs:
print("第"+str(i+1)+"个文字块的内容是:"+run.text)
doc.add_heading(“标题名称”,level=标题等级),level=
可以省略
整数 0 表示标题是 Title 样式,这用于文档的顶部。整数 1 到 45是不同的标题层次,是主要的标题, 45是最低层的子标题
import docx
doc=docx.Document()
doc.add_heading('标题0',0)
doc.add_heading('标题1',1)
doc.add_heading('标题2',2)
doc.add_heading('标题3',3)
doc.save('添加标题.docx')
补充:获取标题
import docx
doc=docx.Document("添加标题.docx")
for p in doc.paragraphs:
style_name = p.style.name
if style_name.startswith('Heading'):
print(style_name,p.text,sep=';')
doc.add_paragraph(“段落文字内容”)
import docx
from docx import Document
doc=docx.Document()
paragraph1 = doc.add_paragraph("这是一个段落")
paragraph2 = doc.add_paragraph("这是第二个段落")
#插入有序列表,段落的前面会有序号123
doc.add_paragraph('把冰箱门打开',style='List Number')
doc.add_paragraph('把大象装进去',style='List Number')
doc.add_paragraph('把冰箱门关上',style='List Number')
#插入无序列表,段落的前面没有序号
doc.add_paragraph('把冰箱门打开',style='List Bullet')
doc.add_paragraph('把大象装进去',style='List Bullet')
doc.add_paragraph('把冰箱门关上',style='List Bullet')
doc.save("添加段落.docx")
paragraph.add_run(‘文字内容’)
import docx
from docx import Document
doc=docx.Document()
paragraph1 = doc.add_paragraph()
paragraph2 = doc.add_paragraph()
paragraph3 = doc.add_paragraph()
paragraph1.add_run('加粗').bold = True
paragraph2.add_run('斜体').italic = True
paragraph3.add_run('普通')
doc.save("添加文字块.docx")
doc.add_picture(图片地址)
import docx
from docx import Document
doc=docx.Document()
doc.add_picture('图片.png')
doc.save("添加图片.docx")
doc.add_picture(图片地址,width=宽度,height=高度)
只给一个宽度或高度,另一个的尺寸会自动计算。
import docx
from docx import Document
from docx.shared import Cm
doc=docx.Document()
doc.add_picture('图片.png',width=Cm(5),height=Cm(5))
doc.save("添加图片.docx")
doc.add_table(rows=多少行, cols=多少列,表格形式)
写入的数据不得超过规定的行和列。
import docx
from docx import Document
from docx.shared import Cm
doc=docx.Document()
list1 = [
["姓名", "性别", "家庭地址"],
["李雷", "男", "湖北省"],
["韩梅梅", "女", "北京市"],
["夏洛特", "男", "广东省"],
["马冬梅", "女", "湖南省"]
]
list2 = [
["姓名", "性别", "家庭地址"],
["貂蝉", "女", "河北省"],
["杨贵妃", "女", "贵州省"],
["西施", "女", "山东省"]
]
table1 = doc.add_table(rows=5, cols=3)
for row in range(5):
cells = table1.rows[row].cells
for col in range(3):
cells[col].text = str(list1[row][col])
doc.add_paragraph("--------------------------------------------------------------------------------------------------------------------")
table2 = doc.add_table(rows=4, cols=3)
for row in range(4):
cells = table2.rows[row].cells
for col in range(3):
cells[col].text = str(list2[row][col])
doc.add_paragraph("--------------------------------------------------------------------------------------------------------------------")
#插入一个6行6列的表格
table3 = doc.add_table(rows=6, cols=6)
for i in range(0, 6):
for j in range(0, 6):
table3.cell(i, j).text = "第{i}行{j}列".format(i=i + 1, j=j + 1)
doc.save("添加表格.docx")
补充:提取表格内容并写入Excel中。
from docx import Document
from openpyxl import Workbook
doc = Document("添加表格.docx")
# tables[0]表示提取第一个表格,tables[1]表示提取第二个表格,依次类推。
t0 = doc.tables[0]
workbook = Workbook()
sheet = workbook.active
for i in range(len(t0.rows)):
list1 = []
for j in range(len(t0.columns)):
list1.append(t0.cell(i,j).text)
sheet.append(list1)
workbook.save(filename = "来自word中的表.xlsx")
# 遍历所有表格
for table in doc.tables:
print ('----table------')
for row in table.rows: # 遍历表格的所有行
# 按原格式输出数据
# row_str = '\t'.join([cell.text for cell in row.cells])
# print(row_str)
# 遍历所有行的所有单元格内容
for cell in row.cells:
print (cell.text, '\t')
doc.add_page_break()
import docx
from docx import Document
doc=docx.Document()
doc.add_paragraph('this is on the first page')
doc.add_page_break()
doc.add_paragraph('this is on the seconed page')
doc.save("添加分页.docx")
'''
换页只需要把docx.enum.text.WD_BREAK.PAGE作为唯一的参数传递给add_break
如果是换行的话就不需要使用docx.enum.text.WD_BREAK.PAGE参数
doc.paragraphs[0].runs[0].add_break(docx.enum.text.WD_BREAK.PAGE)
'''
run.font.样式 = xxx
from docx import Document
from docx.shared import Pt,RGBColor #字号,颜色
from docx.oxml.ns import qn #设置中文字体需要该模块
doc = Document()
paragraph1 = doc.add_paragraph("这是一个段落")
paragraph2 = doc.add_paragraph("这是第二个段落")
for paragraph in doc.paragraphs:
for run in paragraph.runs:
run.font.bold = True
run.font.italic = True
run.font.underline = True
run.font.strike = True
run.font.shadow = True
run.font.size = Pt(18)
run.font.color.rgb = RGBColor(255,255,0)
run.font.name = "微软雅黑"
# 设置像微软雅黑这样的中文字体,必须添加下面2行代码
r = run._element.rPr.rFonts
r.set(qn("w:eastAsia"),"微软雅黑")
doc.save("修改字体样式.docx")
doc.paragraphs.alignment = 对齐方式
from docx.enum.text import WD_ALIGN_PARAGRAPH
paragraphs.alignment = WD_ALIGN_PARAGRAPH.CENTER
可选的对齐方式:
LEFT,CENTER,RIGHT,JUSTIFY,DISTRIBUTE,JUSTIFY_MED,JUSTIFY_HI,JUSTIFY_LOW,THAI_JUSTIFY
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
paragraph1 = doc.add_paragraph("这是一个段落")
paragraph2 = doc.add_paragraph("这是第二个段落")
# [0]表示第一个段落,依次类推
doc.paragraph[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
# 这里设置的是居中对齐
doc.save("修改段落样式.docx")
paragraph.paragraph_format.line_spacing = 行间距
注意用浮点数,5.0就表示5倍行间距
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
paragraph1 = doc.add_paragraph("这是一个段落")
paragraph2 = doc.add_paragraph("这是第二个段落")
for paragraph in doc.paragraphs:
paragraph.paragraph_format.line_spacing = 5.0
doc.save("修改行间距.docx")
paragraph.paragraph_format.space_before = Pt(12)
Pt(12)表示12磅
from docx import Document
from docx.shared import Pt
doc = Document()
paragraph1 = doc.add_paragraph("这是一个段落")
paragraph2 = doc.add_paragraph("这是第二个段落")
for paragraph in doc.paragraphs:
paragraph.paragraph_format.space_before = Pt(24)
paragraph.paragraph_format.space_after = Pt(12)
doc.save("修改段前与段后间距.docx")