欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python处理office文档

程序员文章站 2022-03-31 12:08:39
本例环境基于ubuntu18.04,python3,wps。所有本例用到的类库都使用pip3来安装。首先安装pip3。sudo apt install pip3 1. python处理word文档安装处理word文档用到的python类库python-docx。pip3 install python-docx......

本例环境基于ubuntu18.04,python3,wps。所有本例用到的类库都使用pip3来安装。首先安装pip3。

sudo apt install pip3 

1. python处理word文档

安装处理word文档用到的python类库python-docx

pip3 install python-docx
1.1 基础操作

一下是官方文档的一段示例代码,此处添加了注释:

# coding=utf-8

from docx import Document  # 文档对象
from docx.shared import Inches # 英尺

# 创建文档对象
document = Document()

# 增加文档标题(0级标题)
document.add_heading('文章标题',0)

# 增加段落
p = document.add_paragraph('你让他用戒指把你套上的时候,我察觉到你脸上复杂的笑容。')

# 段落后追加内容并设置追加的内容为粗体
p.add_run('追加的段落内容,样式为粗体。').bold = True

# 段落后追加内容并设置追加的内容为斜体
p.add_run('追加的段落内容,样式为斜体').italic = True

# 添加一级标题
document.add_heading('一级标题', level = 1)

#添加段落并设置段落为引用样式
document.add_paragraph('添加段落并添加了样式,此处的样式为引用', style= 'Intense Quote')

#增加段落并在段落前面加上项目符号(List Bullet样式为)
document.add_paragraph(
    '此处是项目符号样式', style = 'List Bullet'
)

#增加段落并添加编号
document.add_paragraph(
    '此处是编号样式', style = 'List Number'
)

# 添加图片并设置宽度为5英寸
document.add_picture('xq.jpg', width=Inches(5))


#创建一个二维元组,保存即将操作的表格的内容
records = (
    (1, '张三', '30'),
    (2, '李四', '35'),
    (3, '王五', '38')
)

# 创建一个1行3列的表格
table = document.add_table(rows=1,cols=3)

# 在表格第一行填充内容
hdr_cells = table.rows[0].cells
hdr_cells[0].text= '编号'
hdr_cells[1].text= '姓名'
hdr_cells[2].text= '年龄'

# 将定义好的表格内容追加进表格中
for bh, nl, xb in records:
    # 表格追加一行并分别填充1,2,3单元格
    row_cells = table .add_row().cells
    row_cells[0].text = str(bh)
    row_cells[1].text = nl
    row_cells[2].text = xb

# 添加分页符
document.add_page_break()

#保存文档
document.save('demo.docx')

生成的文档如下图:
python处理office文档

1.2关于基础操作的补充:
1.2.1关于Document对象:
  • Document对象不仅可以创建文档,还可以打开文档,以下示例代码打开并新建了一个文件:
document = Document('文档.docx')
document.save('新文档.docx')
#此处的操作是基于原来的文档内容新建了一个文档,原来的文档还存在
  • 也可以用python的文件操作来打开文档,并转为Document对象
# 此处的b表示以二进制格式打开,以兼容win环境和某些低版本的linux.
f = open('demo.docx', 'rb')
document = Document(f)
f.close()
  • Document也可以接受流对象,这对网络传输来说很方便。
from io import BytesIO

with open('demo1.docx', 'rb') as f:
    source_stream = BytesIO(f.read())
document = Document(source_stream)
source_stream.close()
#此处可以对document进行其他操作,最后保存文档
document.save('demo2.docx')
1.2.2 关于段落属性的设置

由于段落有多种属性,通常定义一个段落样式,将很多属性放在样式中,然后样式应用于段落。

  • 水平对齐,用到的是枚举WD_PARAGRAPH_ALIGNMENT的值。可选的值有:
    CENTER:居中对齐
    DISTRIBUTE:分散对齐
    JUSTIFY:两端对齐
    THAI_JUSTIFY
    JUSTIFY_HI
    JUSTIFY_LOW
    JUSTIFY_MED
    LEFT:左对齐
    RIGHT:右对齐
# coding=utf-8

from docx import Document  # 文档对象
from docx.enum.text import WD_ALIGN_PARAGRAPH

document = Document()

# 定义三个段落,分别演示左中右对齐
paragraph1 = document.add_paragraph(
    '段落对齐测试(水平左对齐)'
)

paragraph2= document.add_paragraph(
    '段落对齐测试(水平居中对齐)'
)

paragraph3= document.add_paragraph(
    '段落对齐测试(水平右对齐)'
)
# 定义段落样式
paragraph_format1 = paragraph1.paragraph_format
paragraph_format2 = paragraph2.paragraph_format
paragraph_format3 = paragraph3.paragraph_format

# 在段落样式上添加对齐属性,可以添加其他更多属性
paragraph_format1.alignment = WD_ALIGN_PARAGRAPH.LEFT
paragraph_format2.alignment = WD_ALIGN_PARAGRAPH.CENTER
paragraph_format3.alignment = WD_ALIGN_PARAGRAPH.RIGHT


document.save('demo3.docx')

样式如图所示:
python处理office文档

  • 缩进
from docx.shared import Pt #像素

document = Document()

#定义三个段落,分别演示左中右对齐
paragraph1 = document.add_paragraph(
   '段落缩进(左缩进)'
)

paragraph2= document.add_paragraph(
   '段落缩进(右缩进)'
)

paragraph3= document.add_paragraph(
   '首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进首行缩进'
)

#定义段落样式
paragraph_format1 = paragraph1.paragraph_format
paragraph_format2 = paragraph2.paragraph_format
paragraph_format3 = paragraph3.paragraph_format


#左缩进0.5英尺
paragraph_format1.left_indent = Inches(0.5)

#右缩进24像素
paragraph_format2.right_indent = Pt(24)

#首行缩进(负值表示悬挂缩进)
#paragraph_format3.first_line_indent = Inches(0.5)
paragraph_format3.first_line_indent = Inches(-0.5)

document.save('demo4.docx')

样式如下:
python处理office文档

  • 段间距
#段前间距
paragraph_format.space_before = Pt(18)
#段后间距
paragraph_format.space_after = Pt(12)
  • 行间距
from docx.shared import Length
paragraph_format.line_spacing = Pt(18)
  • 字符格式
from docx.shared import RGBColor
document = Document()
run = document.add_paragraph().add_run()
font = run.font
#设置字体字号斜体粗体字体颜色
font.name = 'Calibri'
font.size = Pt(12)
font.italic = True
font.bold = True
font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
1.2.3 样式设置

样式分为段落样式,表格样式,段落样式可选:
Body Text,Body Text 2,Body Text 3,Caption,Heading 3,Heading 4,Heading 5,Heading 6,Heading 7,Heading 8,Heading 9,Intense Quote,List,List 2,List 3,List Bullet,List Bullet 2,List Bullet 3,List Continue,List Continue 2,List Continue 3,List Number,List Number 2,List Number 3,List Paragraph,macro,Normal,Header,Footer,Heading 1,Heading 2,No Spacing,Quote,Subtitle,Title,TOC Heading

表格样式可选:
Normal Table,Table Grid,Light Shading,Light Shading Accent 1,Light Shading Accent 2,Light Shading Accent 3,Light Shading Accent 4,Light Shading Accent 5,Light Shading Accent 6,Light List,Light List Accent 1,Light List Accent 2,Light List Accent 3,Light List Accent 4,Light List Accent 5,Light List Accent 6,Light Grid,Light Grid Accent 1,Light Grid Accent 2,Light Grid Accent 3,Light Grid Accent 4,Light Grid Accent 5,Light Grid Accent 6,Medium Shading 1,Medium Shading 1 Accent 1,Medium Shading 1 Accent 2,Medium Shading 1 Accent 3,Medium Shading 1 Accent 4,Medium Shading 1 Accent 5,Medium Shading 1 Accent 6,Medium Shading 2,Medium Shading 2 Accent 1,Medium Shading 2 Accent 2,Medium Shading 2 Accent 3,Medium Shading 2 Accent 4,Medium Shading 2 Accent 5,Medium Shading 2 Accent 6,Medium List 1,Medium List 1 Accent 1,Medium List 1 Accent 2,Medium List 1 Accent 3,Medium List 1 Accent 4,Medium List 1 Accent 5,Medium List 1 Accent 6,Medium List 2,Medium List 2 Accent 1,Medium List 2 Accent 2,Medium List 2 Accent 3,Medium List 2 Accent 4,Medium List 2 Accent 5,Medium List 2 Accent 6,Medium Grid 1,Medium Grid 1 Accent 1,Medium Grid 1 Accent 2,Medium Grid 1 Accent 3,Medium Grid 1 Accent 4,Medium Grid 1 Accent 5,Medium Grid 1 Accent 6,Medium Grid 2,Medium Grid 2 Accent 1,Medium Grid 2 Accent 2,Medium Grid 2 Accent 3,Medium Grid 2 Accent 4,Medium Grid 2 Accent 5,Medium Grid 2 Accent 6,Medium Grid 3,Medium Grid 3 Accent 1,Medium Grid 3 Accent 2,Medium Grid 3 Accent 3,Medium Grid 3 Accent 4,Medium Grid 3 Accent 5,Medium Grid 3 Accent 6,Dark List,Dark List Accent 1,Dark List Accent 2,Dark List Accent 3,Dark List Accent 4,Dark List Accent 5,Dark List Accent 6,Colorful Shading,Colorful Shading Accent 1,Colorful Shading Accent 2,Colorful Shading Accent 3,Colorful Shading Accent 4,Colorful Shading Accent 5,Colorful Shading Accent 6,Colorful List,Colorful List Accent 1,Colorful List Accent 2,Colorful List Accent 3,Colorful List Accent 4,Colorful List Accent 5,Colorful List Accent 6,Colorful Grid,Colorful Grid Accent 1,Colorful Grid Accent 2,Colorful Grid Accent 3,Colorful Grid Accent 4,Colorful Grid Accent 5,Colorful Grid Accent 6

  • 段落样式设置
# 以下两种方式都可以设置段落样式
paragraph.style = document.styles['Heading 1']
paragraph.style = 'List Bullet'
  • 表格样式设置
table.style = 'Colorful Grid Accent 6'
1.2.4 Sections对象

sections对象是Document的直接子对象,主要 用来操作页面布局以及页边距等,中文叫做或者。一个文档通常只有一段,而含有多个段的文档通常是文档中既有横向布局的页面也有纵向布局的页面。

  • 改变页面尺寸和方向
from docx.enum.section import WD_ORIENT

document = Document()
#获取节对象
sections = document.sections
section = sections[0]
# 修改页宽和页高
section.page_height = Inches(5)
section.page_width = Inches(8.5)
 # 修改页面布局为横向布局
section.orientation = WD_ORIENT.LANDSCAPE
#修改页面布局为纵向布局
#section.orientation = WD_ORIENT.PORTRAIT
  • 修改页边距
#左边距
section.left_margin = Inches(1)
#右边距
section.right_margin = Inches(1)
#上边距
section.top_margin = Inches(1)
#下边距
section.bottom_margin = Inches(1)
# 装订线宽度
section.gutter = Inches(0.5)
#页眉宽度
section.header_distance = Inches(0.5)
#页脚宽度
section.footer_distance = Inches(0.5)
1.2.5 页眉页脚
document = Document()
section = document.sections[0]
header = section.header
#添加页眉内容并添加样式
paragraph = header.paragraphs[0]
paragraph.text = "文档名称\t文档作者\txxx建筑设计有限公司第六分部"
paragraph.style = document.styles["Header"]
#删除页眉
#is_linked_to_previous是一个布尔属性,添加页眉是此值自动置为False
#将此值手动赋值为True事,将会清除页眉内容
#header.is_linked_to_previous = True

样式如下:
python处理office文档
以上介绍了利用python-docx操作word文档的基本内容,更多操作详见官方文档:python-docx

未完待续....

本文地址:https://blog.csdn.net/momo1938/article/details/107089794