Python docx学习笔记

news2024/11/15 11:07:49

个人学习笔记。

1 工具介绍

python-docx 是用于创建可修改 微软 Word 的一个 python 库,提供全套的 Word 操作,是最常用的 Word 工具。

1.1 基本概念

  • Document:是一个 Word 文档 对象,不同于 VBA 中 Worksheet 的概念,Document 是独立的,打开不同的Word 文档,就会有不同的 Document 对象,相互之间没有影响。
  • Paragraph:是段落,一个 Word 文档由多个段落组成,当在文档中输入一个回车键,就会成为新的段落,输入 shift + 回车,不会分段。
  • Run: 表示一个节段,每个段落由多个节段组成,一个段落中具有相同样式的连续文本,组成一个节段,所以一个 段落对象有多个 Run 列表。
    在这里插入图片描述

1.2 对象介绍

此处只列出部分,剩余的部分,见官方文档介绍。

1.2.1 Document objects

整篇word文档的对象,可以对该对象添加标题、段落、表格、图片等信息。

在这里插入图片描述

1.2.2 Paragraph objects

段落对象,可以在段落里面添加一个节段、段落前添加一个段落(不支持在后面添加)、设置格式等。
在这里插入图片描述

1.2.3 Table objects

表格对象,常规的添加行、列、合并单元格等。
在这里插入图片描述

2 实操

实现功能:在word文档的指定位置添加相应的宏定义和函数定义

2.1 准备材料

word文档模板:
在这里插入图片描述
备注:
1、需要现在word文档中设置好自动编号(关联到相应标题)
2、相应标题格式(字体颜色、大小等)需要提前调整,脚本只是应用,占时不修改属性

2.2 运行结果

在这里插入图片描述

2.3 代码

from docx import Document
from docx.enum.table import WD_ALIGN_VERTICAL  # 导入单元格垂直对齐
from docx.shared import Cm, Inches, Pt
import re

Column = 4   # 设置表格列数
# 这里添加表格内容,具体内容后期提取代码或提前PDF文档
EnumInfo = [{'Name': 'Crypto_AlgorithmFamilyType', 'kind': 'Enumeration',
             'Range': [['CRYPTO_ALGOFAM_NOT_SET', '0x00', 'Algorithm family is not set'],
                       ['CRYPTO_ALGOFAM_SHA1', '0x01', 'SHA1 hash'],
                       ['CRYPTO_ALGOFAM_SHA2_224', '0x01', 'SHA2-224 hash']],
             'Description': 'Enumeration of the algorithm family.', 'Availablevia': 'Crypto_GeneralTypes.h'},
            {'Name': 'Crypto_InputOutputRedirectionConfigType', 'kind': 'Enumeration',
             'Range': [['CRYPTO_REDIRECT_CONFIG_PRIMARY_INPUT', '0x01', '--'],
                       ['CRYPTO_REDIRECT_CONFIG_SECONDARY_INPUT', '0x02', '--']],
             'Description': 'Defines which of the input/output parameters are re-directed to a key element. Thevalues can be combined to define a bit field.',
             'Availablevia': 'Crypto_GeneralTypes.h'}
            ]

def addEnum(document, paragraph):
    for type in EnumInfo:
        paragraph1 = paragraph.insert_paragraph_before(type['Name'], style='Heading 3')
        lineNumber = 0
        table1 = document.add_table(4, Column, style='Table Grid')  # 添加一个4行4列的表格,表格样式为Table Grid
        table1.autofit = False
        table1.allow_autofit = False

    # 设置表格宽度
    table1.columns[0].width = Cm(2)
    table1.columns[1].width = Cm(4)
    table1.columns[2].width = Cm(1.5)
    table1.columns[3].width = Cm(8)
    # 设置第一行高度为1cm
    table1.rows[0].height = Cm(1)

    # 填充Name信息
    table1.cell(lineNumber, 0).text = 'Name'
    table1.cell(lineNumber, 1).merge(table1.cell(lineNumber, 2)).merge(table1.cell(lineNumber, 3))
    table1.cell(lineNumber, 1).text = type['Name']
    lineNumber = lineNumber + 1
    # 填充Kind信息
    table1.cell(lineNumber, 0).text = 'kind'
    table1.cell(lineNumber, 1).merge(table1.cell(lineNumber, 2)).merge(table1.cell(lineNumber, 3))
    table1.cell(lineNumber, 1).text = type['kind']
    lineNumber = lineNumber + 1
    # 填充具体的枚举数据
    for i in range(0, len(type['Range'])):
        table1.cell(lineNumber + i, 1).text = type['Range'][i][0]
        table1.cell(lineNumber + i, 2).text = type['Range'][i][1]
        table1.cell(lineNumber + i, 3).text = type['Range'][i][2]
        table1.add_row()
    lineNumber = lineNumber + len(type['Range'])  # 计算下一行的索引
    # 合并第一列表格(枚举相关的行)
    for i in range(2, lineNumber - 1):  # 总共需要合并lineNumber - 1次
        table1.cell(i, 0).merge(table1.cell(i + 1, 0))
    table1.cell(2, 0).text = 'Range'
    table1.cell(2, 0).vertical_alignment = WD_ALIGN_VERTICAL.CENTER  # 设置为水平居中

    # 填充Description、Availablevia信息
    table1.cell(lineNumber, 0).text = 'Description'
    table1.cell(lineNumber, 1).merge(table1.cell(lineNumber, 2)).merge(table1.cell(lineNumber, 3))
    table1.cell(lineNumber, 1).text = type['Description']
    lineNumber = lineNumber + 1
    table1.cell(lineNumber, 0).text = 'Availablevia'
    table1.cell(lineNumber, 1).merge(table1.cell(lineNumber, 2)).merge(table1.cell(lineNumber, 3))
    table1.cell(lineNumber, 1).text = type['Availablevia']

    move_table_after(table1, paragraph1)  # 移动到段落后面(表格只能创建到文档末尾)
# 函数功能:移动指定表格到段落后面
def move_table_after(table, paragraph): 
    tbl, p = table._tbl, paragraph._p
    p.addnext(tbl)


def main():
    # 实例化一个Document对象,相当于打开word软件,新建一个空白文件
    document = Document('test.docx')
    for paragraph in document.paragraphs:
        if (paragraph.style.name.startswith('Heading')):  # 识别标题,注意:这里是在标题前添加相关信息,若要在枚举章节添加枚举定义,则需要识别下一个章节标题
            if re.search('函数接口定义', paragraph.text):   # 实际是编辑上一个章节“枚举类型定义”的内容
                pass
            elif re.search('其他', paragraph.text):        # 编辑“函数接口定义内容”
                addEnum(document, paragraph)  # 添加枚举类型
    document.save(f"test.docx")


if __name__ == "__main__":
    main()

3 参考资料

3.1 官方链接

https://python-docx.readthedocs.io/en/latest/index.html#

在这里插入图片描述
刚入门可以看该章节快速上手,具体API和对象的熟悉可以看下面的“API Documentation”。
在这里插入图片描述

3.2 其他博主

强烈推荐学习此博主的博文,本文部分内容从中摘选。

https://blog.csdn.net/yuetaope/article/details/119444970

4. 其他

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带你搞清楚strtok函数和strerror函数的使用!

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

Linux 多进程开发(上)

第二章 Linux 多进程开发 2.1 进程概述2.2 进程状态转换2.3 进程创建2.4 exec 函数族2.5 进程控制 网络编程系列文章: 第1章 Linux系统编程入门(上) 第1章 Linux系统编程入门(下) 第2章 Linux多进程开发(…

python 基础知识点(蓝桥杯python科目个人复习计划62)

今日复习内容:做题 例题1:付账问题 问题描述: 几个人一起出去吃饭是常有的事,但在结账的时候,常常会出现一些争执。 现在有n个人出去吃饭,他们总共消费了S元,其中第i人带了ai元。幸运的是&a…

关于仅销售预包装食品的食品经营者备案有关事项的通知

江北新区、各区市场监督管理局、行政审批局: 为贯彻落实《中华人民共和国食品安全法》第三十五条规定和国务院《关于深化“证照分离”改革进一步激发食品安全发展活力的通知》精神《市场主体》(国发[2021]7号),现将仅销售预包装食…

ModuleNotFoundError: No module named ‘serial.tools‘

解决以上报错的方法: 1、大家在使用以下代码时: port_list list(serial.tools.list_ports.comports()) 会出现报错: ModuleNotFoundError: No module named serial.tools; serial is not a package 这个时候我们应该先安装serial 然…

Codeforces Round 933 (Div. 3)C:Rudolf and the Ugly String

题目链接:Dashboard - Codeforces Round 933 (Div. 3) - Codeforces 解题思路: 解题思路: 题目大概意思是字符串中最少去掉几个单词可以使字符串变漂亮,其实只要找“map"和”pie“这两个单词数量,注意判断&quo…

19、deque赋值操作

#include <iostream> using namespace std; #include <deque>void printdeque (const deque<int>& d) {for (deque<int>::const_iterator it d.begin(); it ! d.end(); it ){//*it 100 容器中的数据不可修改cout << *it << " &…

CAN一致性测试:物理层测试之位时间测试

从本周开始结合工作实践&#xff0c;给大家总结CAN一致性相关的测试 包括&#xff1a;物理层、数据链路层、应用层三大块知识点 CAN一致性测试:物理层测试之位时间测试 试验目的&#xff1a;测试控制器输出的差分电平位信号的特征。 试验依据&#xff1a;GMW3122&#xff0…

C++第二弹---C++入门(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 C入门 1、函数重载 1.1、函数重载概念 1.2、C支持函数重载的原理--名字修饰(name Mangling) 3、引用 3.1、引用概念 3.2、引用特性 3.3、常引用 …

图片和PDF 加水印去水印

图片和PDF 加水印去水印 前要1. 图片加水印1.1 方法11.2 方法2 2. 去水印3. pdf加水印4. pdf 去水印 前要 网上查了很多资料, 汇总了几个不错的代码, 顺便做个笔记 1. 图片加水印 1.1 方法1 简单方便, 后也好处理 # -*- coding:utf-8 -*- import os from PIL import Imag…

蓝桥杯练习系统(算法训练)ALGO-975 P0802字符串表达式

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个字符串表达式求解函数int expression(char* s); 输入一个字符串表达式&#xff0c;返回它的结果。表达式长度不会超过100。表…

基于springboot+vue的汽车改装方案网站(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 对于当今社会发展趋势越来越迅猛&#xff0c;传统汽车改装模式的没落,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变&#xff0c;人们的娱乐方式不仅仅再是读书看报。由于近些…

【基于HTML5的网页设计及应用】——判断是否为闰年

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Linux运维之管理工具篇

一、前言 因运维过程中&#xff0c;经常会借助于很多工具来实现我们的监控、备份、校验&#xff0c;安全测试&#xff0c;批量操作&#xff0c;可视化辅助&#xff0c;集中管理等&#xff0c;甚至AI相关&#xff0c;本文特对常用工具进行梳理记录&#xff0c;以备不时之需及后…

【Consul】注册Consul服务时报错404

【Consul】注册Consul服务时报错404 大家好 我是寸铁&#x1f44a; 总结了一篇golang注册Consul服务时报错404✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 今天寸铁想注册一个服务到Consul服务中心&#xff0c;却发现报错了&#xff0c;错误码是404&#xff0c;下面和…

精通 Python 装饰器:代码复用与功能增强技巧

精通 Python 装饰器&#xff1a;代码复用与功能增强技巧 引言装饰器基础装饰器的定义基本装饰器的实现方法理解 符号的用法简单装饰器示例代码 使用装饰器增强函数功能日志记录性能测试事务处理小结 装饰器进阶应用管理用户认证缓存机制的实现参数化装饰器的创建和应用多个装饰…

unity

Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 Unity Remote - Unity 手册 登陆账号&#xff0c;找到一个3d 免费资源 3D Animations & Models | Unity Asset Store unity 里面window->package Manager 里面可以看到自己的asset &#xff0c;下载后…

xlsx.js读取本地文件,按行转成数组数据

1.下包 //1. npm install xlsx //2. yarn add xlsx2.结构 <template><input type"file" change"onFileChange" /> </template>3.代码 <script> import * as XLSX from xlsxexport default {methods: {onFileChange (event) {/…

基于SpringBoot的“学生成绩管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“学生成绩管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面图 管理员功能界面图 学生管理界面图…

解决方案∣解密新能源产业的供应链革新之路,助力行业驶入数字化转型“快车道”

近期&#xff0c;备受关注的2024年全国两会如期举行&#xff0c;国务院总理李强作政府工作报告中多次提到锂电产业链上下游。 政府工作报告指出&#xff0c;2023年&#xff0c;国内新能源汽车产销量分别达到958.7万辆和949.5万辆&#xff0c;占全球比重超60%&#xff0c;产销连…