(1条消息) Python自动化办公

1 安装模块

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

2 读取Word文档内容

2.1 文档结构

注意:一个run对象是相同样式文本的延续,如颜色、字体、粗细、斜体不同,文字加粗和后面没有加粗操作的,属于不同的文字块。

2.2 获取段落和文字块

1)获取段落paragraph

① 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)

2)获取文字块Run

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)

3 向文档中写入内容

3.1 添加文字

1)添加标题

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=';')

2)添加段落

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")

3)添加文字块

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")

3.2 添加图片和表格

1)添加图片

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")

2)添加表格

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')

3.3 添加分页

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)
'''

4 调整Word文档样式

4.1 对文字字体样式进行修改

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")

4.2 修改段落样式

1)对齐样式

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")

2)行间距调整

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")

3)段前与段后间距

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")
(0)

相关推荐

  • 使用python-docx模块读写word文件

    word文档的自动化处理是一件比较头痛的事情,因为深耕于windows操作系统,对于跨平台需求的word文档编辑,是非常痛苦的一件事.在python的生态环境中,提供了python-docx这个模块, ...

  • 利用python实现字音回填

    作者:小小明 python-docx简介 利用python读写word文档的库是python-docx,安装: pip install python-docx python-docx 官方文档:htt ...

  • 用python解析word文件(三):style

    太长了,我决定还是拆开三篇写. (一)段落篇(paragraph) (二)表格篇(table) (三)样式篇(style)(本篇) 选你所需即可.下面开始正文. 在前两篇中,我们已经解析出了parag ...

  • 怜香惜玉,我用python帮助办公室文秘

    请输入标题     bcdef 厉害了我的哥,今天我看到一个docx库,可以对word文档进行操作,拯救陷身于繁琐word操作,沦为办公软件的奴隶. 如果学会了docx基本功,那么以后加上for循环, ...

  • Python|读取word文档表格内容

    引言在日常生活里,不管是办公.学习还是制作邀请函.请柬.简历等等,我们都会使用一个软件Microsoft Office Word,Office Word是微软公司的一个收费文字处理应用程序,是最流行的 ...

  • Python+MySQL随机试卷及答案生成程序

    一.背景 本文章主要是分享如何使用Python从MySQL数据库中面抽取试题,生成的试卷每一份都不一样. 二.准备工作 1.安装Python3 下载地址:https://www.python.org/ ...

  • python编程操作office三剑客之word篇

    安装包 安装pip install python-docx -i https://pypi.doubanio.com/simple/引用import docx官方文档https://python-do ...

  • (7条消息) Python爬虫自动化办工实战案例

    Python爬虫自动化办工实战案例 ----借助xlwings实现excel调用Python爬虫 前言   本案例将实现excel集成用户自定义Python函数(xlwings UDFs),并从exc ...

  • (3条消息) Python实现

    二次函数拟合--最小二乘法公式法 与线性回归相似,对二次函数进行拟合某种意义上也只是加了一个函数,虽然求解的方程变得更加繁琐,需要准备的变量也增加到了七个. 思路有借鉴于:最小二乘法拟合二次曲线 C语 ...

  • (1条消息) python常见图形代码可视化大全整理(包括动图)更新中...

    目录 一.离散型变量的可视化 1 饼图 1.1 matplotlib模块 1.2 panda模块 2 条形图 2.1 matplotlib模块 2.1.1 垂直或水平条形图 2.1.2 堆叠条形图 2 ...

  • python自动化办公:实现按照一列内容拆分excel

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 作者:卡卡 来源:卡卡的霍格莫德小镇 用python将某一列按照内容分成多个excel 我们经常会 ...

  • (2条消息) Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)

    ahilll 2018-08-09 10:11:22 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 二.Tkinte ...

  • (1条消息) python的江湖世界

    原创不易,侵权有究,转载请备注链接和原作者 https://blog.csdn.net/gkbxs/article/details/115490719 天下武功数少林,天外有天生奇云,在编程的世界里微 ...

  • (4条消息) python爬虫之bs4的基本使用

    BeautifulSoup可以很方便地查找HTML标签以及其中的属性和内容 import requests from bs4 import BeautifulSoup # 创建BeautifulSou ...

  • (1条消息) python 读写 docx

    (1条消息) python 读写 docx

  • (1条消息) python

    官方文档肯定是最正规的,但是有点简单,有必要记一下,网上资料较少. https://python-docx.readthedocs.io/en/latest/dev/analysis/features ...