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

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

时间:2024-05-28 09:03:45浏览次数:31  
标签:段落 办公自动化 run Pt Python doc paragraph 文档 Word

文档格式自动化是一个非常繁琐但又不可或缺的工作,尤其是在特定场景中,例如每年毕业季的论文排版。在毕业季,学生们需要提交符合严格格式要求的毕业论文,这些要求通常包括封面格式、目录、标题格式、页眉页脚、行间距、段前段后距离、引用格式等。手动调整这些格式不仅耗时,而且容易出错。每个细节都可能影响最终的排版效果,因此自动化处理这些格式就显得尤为重要。
毕业论文通常包含多个层级的标题、图表、引用和大量的文本内容。对于没有经验的学生来说,手动设置和调整这些格式可能需要耗费大量的时间。而且,即使是有经验的人员,也可能会在大量重复性工作中出错。使用Python等编程语言通过Word处理库(如python-docx)来自动化文档格式设置,可以显著提高效率和准确性。

一、 文档格式检查与输出

要正确获取并输出文档中所有段落的样式信息,可以使用以下程序。这段代码会遍历文档中的所有段落,并打印每个段落的样式名称及其文本内容。这样可以帮助你检查每个段落的样式,以便进一步调试和调整标题样式。

from docx import Document

def print_paragraph_styles(doc_path):
    doc = Document(doc_path)
    
    for i, paragraph in enumerate(doc.paragraphs):
        style_name = paragraph.style.name
        text = paragraph.text
        print(f"Paragraph {i}: Style: {style_name}, Text: {text}")

# 请将下面路径替换为您要读取的Word文档的路径
file_path = 'target55.docx'
print_paragraph_styles(file_path)

这段代码会输出文档中每个段落的索引、样式名称和文本内容。通过检查这些输出,你可以了解每个段落的实际样式,以便发现那些未被识别为标题的段落的原因。

运行这段代码后,你可能会看到类似如下的输出:

Paragraph 0: Style: Normal, Text: This is some normal text.
Paragraph 1: Style: Heading 1, Text: 一级标题 1
Paragraph 2: Style: Normal, Text: This is some text under 一级标题 1.
Paragraph 3: Style: Heading 2, Text: 二级标题 1.1

通过这种方式,你可以确定每个段落的样式是否正确应用,从而找出那些未被识别为标题的段落,并进行相应的调整。如果有些段落应该是标题但显示为其他样式,你可以手动或通过程序将这些段落的样式调整为正确的标题样式。

二、定制样式修改段落格式

这段Python程序使用python-docx库来修改Word文档中的段落样式。具体来说,它将所有段落中的文本设置为宋体、小四号(12磅)和黑色,同时应用特定的段落格式设置。以下是程序的详细解释:

  • 导入模块
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn

这里导入了处理Word文档的Document类,以及用于设置字体大小和颜色的PtRGBColor类。qn函数用于处理Word文档中的命名空间。

  • 定义设置自定义样式的函数
def set_custom_style(paragraph):
    # 设置段落中的所有run的字体为宋体,小四号,并且颜色为黑色
    for run in paragraph.runs:
        run.font.name = '宋体'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
        run.font.size = Pt(12)  # 小四号对应12磅
        run.font.color.rgb = RGBColor(0, 0, 0)  # 字体颜色为黑色

此函数set_custom_style接受一个段落对象,并将段落中的每个run(一段文本的一个连续部分)的字体设置为宋体、大小设置为小四号(12磅),颜色设置为黑色。

# 设置段落格式
    paragraph_format = paragraph.paragraph_format
    paragraph_format.line_spacing = Pt(20)  # 行间距为20磅
    paragraph_format.space_before = Pt(0)  # 段前为0
    paragraph_format.space_after = Pt(0)  # 段后为0
    paragraph_format.first_line_indent = Pt(24)  # 首行缩进2个中文字符(每个中文字符宽度为12磅

该段代码设置段落的格式,包括:行间距为20磅;段前和段后间距为0;首行缩进2个中文字符(24磅)。

  • 定义应用自定义样式到整个文档的函数
def apply_custom_style_to_document(doc_path):
    # 打开文档
    doc = Document(doc_path)
    
    # 对文档中的每个段落应用自定义样式
    for paragraph in doc.paragraphs:
        set_custom_style(paragraph)
    
    # 保存修改后的文档
    doc.save('modified_' + doc_path)` 

此函数apply_custom_style_to_document接受文档路径作为参数。它执行以下操作:打开指定路径的Word文档;对文档中的每个段落调用set_custom_style函数,应用自定义样式;保存修改后的文档,文件名为modified_加上原始文档名。

  • 调用函数修改目标文档的格式
apply_custom_style_to_document('target.docx')

这行代码调用apply_custom_style_to_document函数,传入文档target.docx的路径,修改其格式并保存修改后的文档。

这个程序自动化地调整Word文档中的段落样式,使每个段落的文本格式统一为宋体、小四号(12磅)、黑色,行间距为20磅,段前段后间距为0,首行缩进2个中文字符。这在处理大量需要统一格式的文档时非常有用,特别是对于学术论文、报告等要求严格格式的文档。

三、自动生成目录

程序使用 python-docx 库来修改现有的 Word 文档,在文档的开头插入一个目录,并为文档中的标题设置特定的样式。

import os
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor
from docx.oxml import OxmlElement

def add_toc(paragraph):
    run = paragraph.add_run()
    fldChar1 = OxmlElement('w:fldChar')
    fldChar1.set(qn('w:fldCharType'), 'begin')
    run._r.append(fldChar1)

    instrText = OxmlElement('w:instrText')
    instrText.set(qn('xml:space'), 'preserve')
    instrText.text = 'TOC \\o "1-3" \\h \\z \\u'
    run._r.append(instrText)

    fldChar2 = OxmlElement('w:fldChar')
    fldChar2.set(qn('w:fldCharType'), 'separate')
    run._r.append(fldChar2)

    fldChar3 = OxmlElement('w:fldChar')
    fldChar3.set(qn('w:fldCharType'), 'end')
    run._r.append(fldChar3)

def set_heading_style(paragraph, level):
    if paragraph.runs:
        run = paragraph.runs[0]
        run.font.name = '黑体'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
        
        if level == 1:
            run.font.size = Pt(16)  # 三号字
            paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
            paragraph.paragraph_format.space_before = Pt(18)
            paragraph.paragraph_format.space_after = Pt(30)
            paragraph.paragraph_format.line_spacing = Pt(20)
        elif level == 2:
            run.font.size = Pt(14)  # 四号字
            paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
            paragraph.paragraph_format.space_before = Pt(10)  # 0.5行(10磅)
            paragraph.paragraph_format.space_after = Pt(10)   # 0.5行(10磅)
            paragraph.paragraph_format.line_spacing = Pt(20)
        elif level == 3:
            run.font.size = Pt(12)  # 小四号字
            paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
            paragraph.paragraph_format.space_before = Pt(10)  # 0.5行(10磅)
            paragraph.paragraph_format.space_after = Pt(10)   # 0.5行(10磅)
            paragraph.paragraph_format.line_spacing = Pt(20)
        
        # 设置序号与标题之间空一格
        run.text = run.text.split(' ')[0] + ' ' + ' '.join(run.text.split(' ')[1:])

def generate_toc_for_existing_document(doc_path):
    doc = Document(doc_path)
    
    # 插入目录到文档的开头
    toc_paragraph = doc.paragraphs[0].insert_paragraph_before()
    add_toc(toc_paragraph)
    toc_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    
    # 插入分页符,使文件内容自动后移
    doc.add_page_break()
    
    # 为所有的标题设置样式
    for paragraph in doc.paragraphs:
        if paragraph.style.name.startswith('Heading'):
            level = int(paragraph.style.name.split()[-1])
            if level in [1, 2, 3]:  # 仅对一、二、三级标题应用样式
                set_heading_style(paragraph, level)
    
    # 保存修改后的文档
    modified_doc_path = 'modified_' + os.path.basename(doc_path)
    doc.save(modified_doc_path)
    print(f"Document saved as {modified_doc_path}. Please open it in Word and update the TOC fields.")

# 请将下面路径替换为您要读取的Word文档的路径
file_path = 'target55.docx'
generate_toc_for_existing_document(file_path)

注意!!!:程序处理完后,并不能在文档中看到生成的目录,需要选中更新才能看到。(Document saved as modified_target55.docx. Please open it in Word and update the TOC fields.)

直接打开文档 选中更新后的文档
选中右键选择更新域

该程序自动化地为现有的 Word 文档添加目录,并根据标题级别调整标题样式。它简化了手动操作的繁琐过程,特别适用于需要大量文档格式统一的场景,如学术论文、报告和项目文档的处理。

总结

Python办公自动化的应用在现代办公环境中越来越重要,尤其在文档处理方面。通过Python,可以实现对文档的检查、修改段落格式以及自动生成目录等功能,从而极大地提高了工作效率。这里通过Python进行文档检查、修改段落格式和自动生成目录,不仅提高了文档处理的效率,还确保了文档格式的标准化和一致性。这些功能在学术、企业、出版等领域有广泛的应用,充分展示了Python在办公自动化中的强大能力。通过不断扩展和优化Python脚本,办公自动化将变得更加高效和智能。

标签:段落,办公自动化,run,Pt,Python,doc,paragraph,文档,Word
From: https://www.cnblogs.com/haohai9309/p/18217015

相关文章

  • 【终极指南】使用Python可视化分析文本情感倾向
    本文分享自华为云社区《Python理解文本情感倾向的终极指南》,作者:柠檬味拥抱。情感分析是一种通过自然语言处理技术来识别、提取和量化文本中的情感倾向的方法。Python在这一领域有着丰富的库和工具,如NLTK、TextBlob和VADER等。本文将介绍如何使用Python进行情感分析,并通过可视化......
  • 记录word替换数据-2
    #导入模块fromdocximportDocumentimportosfromwin32com.clientimportDispatchimportpandasaspd#转换doc文件defdoc_to_docx(file_path):"""将指定的doc文件转化为docx格式:paramfile_path:文件路径"""word=Dispatch......
  • 记录word数据替换-1
    #导入模块importtkinter.filedialogimportosfromwin32com.clientimportDispatchimportpandasaspdimportwin32com.client#转换doc文件defreplace_main(word,old_text,new_text,output_path):#word.Selection.Find.ClearFormatting()#word.Sele......
  • 【PYTHON3】虚拟环境
    一、什么是虚拟环境说直接一点就是独立的python环境有了虚拟环境,可以与其它项目隔离,可以更方便的管理项目所依赖的库,二、什么时候用虚拟环境虚拟环境在创建项目时候就需要创建出来了,不要等到开发完了,进行打包的时候又需要将项目所依赖的包和模块给单独整出来对于中小型项......
  • python closure, first-class function, decorator
    闭包:closurefunctionhtml_tag(tag){ functionwrap_text(msg){  console.log('<'+tag+'>'+msg+'</'+tag+'>') } returnwrap_text}print_h1=html_tag('h1')print_h1('TestHea......
  • 利用ArcGIS Python批量拼接遥感影像(arcpy batch processing)
     本篇文章将说明如何利用ArcGIS10.1自带的PythonIDLE进行遥感影像的批量拼接与裁剪。1.运行环境:ArcGIS10.1(安装传送门)、PythonIDLE2.数据来源:地理空间数据云GDEMV230M分辨率数字高程数据3.解决问题:制作山西省的DEM影像如下图所示,以30M分辨率数字高程数据为例,影像......
  • 谁说爬虫只能Python?看我用C#快速简单实现爬虫开发和演示!
    前言:说到爬虫,基本上清一色的都知道用Python,但是对于一些没玩过或者不想玩Python的来说,却比较头大一点。所以以下我站在C#的角度,来写一个简单的Demo,用来演示C#实现的简单小爬虫。大家感兴趣可以自己拓展出更加丰富的爬虫功能。前提:引用包HtmlAgilityPack 先来个爬取文本。新......
  • (五星)用Python学数学-2021 ([美] 彼得 • 法雷尔(Peter Farrell) [Farrell) etc.)
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso提取码:jqso引言:介绍了本书的目标,即通过Python学习数学的优势和乐趣,以及Python在数学领域的应用概述。Python基础:简要介绍了Python编程语言的基本概念、语法和常用库,为后续的数学学习打下基础。可视化方法:讲解了如何使用Py......
  • 基于 Pre-commit 的 Python项目代码风格统一实践
    背景信息统一代码风格首先需要定义参照的规范,每个团队可能会有自己的规范,我们选择的规范是yapf+mypy+isort,如果保证所有的研发人员都遵循相关规范呢?鼓励IDE中对应的插件的安装,通过直接对应的插件,在编写代码阶段就能实时发现不符合规范的情况,修改成本最低;通过Pre-c......
  • 详解PySide多线程【Python-Pyside图形界面绘制#2】
    在了解pyside多线程之前,如果是初学者可以先去看看我的第一篇文章《超详细实例详解Python多线程》,文中有对多线程的概念进行详细介绍,如果有相关基础可直接跳过。【Python】超详细实例讲解python多线程(threading模块)_pythonthreading介绍-CSDN博客https://blog.csdn.net/Xiao_......