首页 > 编程语言 >Python办公自动化之——调整Word样式

Python办公自动化之——调整Word样式

时间:2024-05-26 20:33:15浏览次数:30  
标签:info style 办公自动化 Word Python docx paragraph 文档 font

在Word排版中,许多繁琐的功能,如文本格式设置、段落对齐、表格操作和图片插入,常常消耗大量时间和精力。借助Python自动化处理,这些任务变得更加高效,python-docx 库为我们提供了极大的帮助。通过该库,可以轻松读取和学习现有文档的样式和格式,并将其应用到新的文档中。这样,用户可以自动化地生成和修改Word文档,而无需手动进行重复性操作,极大地解放了生产力。python-docx 使得自动化办公、报告生成和文档处理变得简单而高效,特别适合需要频繁处理Word文档的工作场景。借助该库,用户不仅可以提高工作效率,还能保证文档的一致性和专业性。

一、 python-docx库概述

官方手册: https://python-docx.readthedocs.io/en/latest/index.html
pypi 官方地址: https://pypi.org/project/python-docx/

python-docx 是一个用于创建和修改Microsoft Word文档(.docx格式)的Python库。它使得在Python代码中处理Word文档变得简单和直观。以下是对 python-docx 库的概述:

1.1 功能概述

python-docx 提供了一组易于使用的API,可以进行以下操作:

创建新文档:可以从头开始创建一个新的Word文档,并向其中添加各种元素,如段落、表格、图片等。
读取和修改现有文档:可以打开现有的Word文档,读取其内容并进行修改,例如添加新内容、删除旧内容或更改格式。
文本操作:可以向文档中添加段落和运行文本,还可以设置文本的字体、大小、颜色、粗体、斜体、下划线等格式。
段落和段落格式:支持段落的对齐、缩进、间距设置等。
表格操作:可以创建表格,添加行和列,合并单元格,设置表格样式等。
图片和其他嵌入对象:可以向文档中插入图片,并控制图片的位置和大小。
样式管理:支持应用和管理不同的文本和段落样式。

1.2 主要组件

  • Document:表示一个Word文档对象,可以通过 docx.Document() 创建一个新文档,或通过提供文件路径打开现有文档。
  • Paragraph:表示文档中的一个段落,可以包含多个 Run 对象。
  • Run:表示段落中的一段连续文本,允许应用特定的文本格式。
  • TableCell:用于创建和操作表格和表格单元格。
  • Section:表示文档中的一个节,可以用来设置页边距、纸张大小和方向等。

1.3 示例代码

以下是一个简单的示例代码,展示如何使用 python-docx 创建和修改Word文档:

import docx
from docx.shared import Pt

# 创建一个新的文档
doc = docx.Document()

# 添加标题和段落
doc.add_heading('Document Title', level=1)
doc.add_paragraph('This is a paragraph in the document.')

# 添加带格式的文本
paragraph = doc.add_paragraph()
run = paragraph.add_run('This is a bold text.')
run.bold = True
run.font.size = Pt(14)

# 保存文档
doc.save('example.docx')

# 打开一个现有文档并读取内容
doc = docx.Document('example.docx')
for para in doc.paragraphs:
    print(para.text)

1.4 优缺点

优点 缺点
易于使用:API设计简洁,易于上手 复杂文档处理:对于非常复杂的文档操作,可能需要深入了解Word文档的结构
功能丰富:支持Word文档的各种常见操作 性能:处理非常大的文档时,性能可能会受到影响
跨平台:可以在不同操作系统上使用,包括Windows、macOS和Linux

python-docx 是一个强大且易用的库,使得在Python中处理Word文档变得高效且便捷,适合各种自动化办公任务和文档生成需求。

二、文档Document结构

通过官方文档的分析,直接给大家两个结构图,如下:

文档结构 表格结构

我们就是根据这两张结构图进行分析和学习python-docx对word文档的处理的。

2.1 word文档的创建和段落操作

不管对文档什么样的操作,首先需要创建或者打开文档,代码如下:

from docx import Document
doc = Document()  # 新建文档对象
doc1 = Document("test.docx")  #打开test.docx文档

有了文档之后,需要对文档的内容进行操作,在这里我们先给一些常用的函数,如下表:

方法 描述
add_heading(text, level=1) 标题段落,text标题内容,level决定段落样式
add_paragraph(text, style=None) 添加段落,text段落内容,style为段落样式
add_page_break() 添加一个分页符
add_picture(image, width=None, height=None) 添加图片,image图片文件,width和height图片的尺寸大小,使用厘米(Cm)或英寸(Inches)换算
add_section(start_type=2) 添加节,start_type为节符的类型
add_table(rows, cols, style=None) 添加表格,rows和cols为行列数,style为表格样式
save(path_or_stream) 保存文档,path_or_stream为保存文件名或文件流
add_run(text) 添加文字块,text为内容
add_style(name, style_type, builtin=False) 添加样式,name为样式名称,style_type为样式类型,builtin是否为内置样式

其实到这里我们就可以操作大部分的文档内容,那么怎么设置一些常用的属性呢?比如对齐方式,行间距,加粗等,下面列举一些常用的属性设置方式,如下:

属性 描述
alignment 对齐样式。
WD_ALIGN_PARAGRAPH.LEFT 左对齐;
WD_ALIGN_PARAGRAPH.CENTER 居中对齐;
WD_ALIGN_PARAGRAPH.RIGHT 右对齐;
WD_ALIGN_PARAGRAPH.JUSTIFY 两端对齐;
font.bold 字体是否加粗。
font.italic 斜体。
font.underline 下划线。
font.font.strike 删除线。
font.size 字体大小。
font.color.rgb 字体颜色。
font.name 使用什么字体。
font.highlight_color 字体高亮。
paragraph_format.line_spacing 行间距。
paragraph_format.space_before 段前间距。
paragraph_format.space_after 段后间距。
paragraph_format.left_indent 调整左缩进,使用Pt衡量。
paragraph_format.right_indent 调整右缩进,使用Pt衡量。

2.2 Word文档的创建和段落操作

不管对文档什么样的操作,首先需要创建或者打开文档,代码如下:

from docx import Document
from docx.shared import Pt, RGBColor  # 设置像素、缩进等, 设置字体颜色
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPE
from docx.enum.text import WD_ALIGN_PARAGRAPH  # 导入段落对齐方式

# 打开文档
doc = Document("test.docx")

# 添加样式
style = doc.styles.add_style('tstyle', WD_STYLE_TYPE.PARAGRAPH)
style.font.color.rgb = RGBColor(0x42, 0x22, 0)

# 添加段落并使用样式
p = doc.add_paragraph("添加段落", style=style)
text = p.add_run("add_run")

# 设置段落格式
for paragraph in doc.paragraphs:
    paragraph.paragraph_format.line_spacing = 3.0
    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
    paragraph.paragraph_format.space_before = Pt(10)
    paragraph.paragraph_format.space_after = Pt(10)
    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(20)
        run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9)
        run.font.name = "仿宋"
        r = run._element.rPr.rFonts
        r.set(qn("w:eastAsia"), "微软雅黑")

# 保存文档
doc.save("test.docx")

三、调整目标文件的段落格式

import docx
from lxml import etree

source_file_name = 'source.docx'
target_file_name = 'target.docx'
output_file_name = 'output.docx'

# 获取样式信息的函数
def get_style_info(doc):
    style_info = {
        'font_name_zh': None,
        'font_name_ascii': None,
        'font_size': None,
        'line_spacing': None,
        'font_color': None
    }

    paragraphs = doc.paragraphs

    if paragraphs:
        first_paragraph = paragraphs[0]
        style = first_paragraph.style
        if style:
            style_element = style.element
            style_xml_str = etree.tostring(style_element, encoding='unicode')
            style_tree = etree.fromstring(style_xml_str)
            nsmap = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}

            style_w_rfonts = style_tree.xpath('.//w:rFonts', namespaces=nsmap)
            if style_w_rfonts:
                style_info['font_name_zh'] = style_w_rfonts[0].get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}eastAsia')
                style_info['font_name_ascii'] = style_w_rfonts[0].get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}ascii')

            style_sz = style_tree.xpath('.//w:sz', namespaces=nsmap)
            if style_sz:
                style_info['font_size'] = style_sz[0].get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val')

            style_spacing = style_tree.xpath('.//w:spacing', namespaces=nsmap)
            if style_spacing:
                style_info['line_spacing'] = style_spacing[0].get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}line')

            style_color = style_tree.xpath('.//w:color', namespaces=nsmap)
            if style_color:
                style_info['font_color'] = style_color[0].get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val')

    return style_info

# 设置样式信息的函数
def set_style_info(doc, style_info):
    paragraphs = doc.paragraphs

    for paragraph in paragraphs:
        for run in paragraph.runs:
            if style_info['font_name_ascii']:
                run.font.name = style_info['font_name_ascii']
            if style_info['font_size']:
                run.font.size = docx.shared.Pt(int(style_info['font_size']) / 2)
            if style_info['font_color']:
                run.font.color.rgb = docx.shared.RGBColor.from_string(style_info['font_color'])
        
        p_style = paragraph.paragraph_format
        if style_info['line_spacing']:
            p_style.line_spacing = docx.shared.Pt(int(style_info['line_spacing']) / 20)

# 读取 source.docx 的样式信息
try:
    source_doc = docx.Document(source_file_name)
    style_info = get_style_info(source_doc)

    # 输出从 source.docx 获得的样式信息
    print('段落样式字体(中文字体):', style_info['font_name_zh'])
    print('段落样式字体(英文字体):', style_info['font_name_ascii'])
    print('字体大小:', style_info['font_size'])
    print('行间距:', style_info['line_spacing'])
    print('字体颜色:', style_info['font_color'])

    # 将样式信息应用到 target.docx 并保存为 output.docx
    target_doc = docx.Document(target_file_name)
    set_style_info(target_doc, style_info)
    target_doc.save(output_file_name)
    print(f'新的文件已保存为 {output_file_name}')

except FileNotFoundError:
    print(f'文件 {source_file_name} 或 {target_file_name} 未找到。')
except Exception as e:
    print(f'发生错误: {e}')

总结

python-docx 是一个用于创建和操作Microsoft Word文档(.docx格式)的Python库。它提供简单直观的API,使用户可以轻松生成和修改Word文档。该库支持基本的文档操作,如添加和格式化文本、段落和表格,插入图片,管理样式等。用户可以从头创建新文档或读取和修改现有文档,方便地进行文本格式设置、段落对齐、表格操作和图片插入等操作。此外,还支持应用和管理不同的文本和段落样式。python-docx 是一个强大且便捷的工具,特别适合用于自动化办公、报告生成和文档处理等应用场景,使日常文档处理变得更加高效和便捷。

参考文献

  1. python-docx结合lxml读取word文档段落格式、字体格式等信息
  2. 用python代码实现公文自动排版 python自动化word排版
  3. Word自动化排版画图,Python还能这么玩?

标签:info,style,办公自动化,Word,Python,docx,paragraph,文档,font
From: https://www.cnblogs.com/haohai9309/p/18214168

相关文章