办公自动化-Python如何提取Word标题并保存到Excel中?

news2024/11/18 23:39:32

办公自动化-Python如何提取Word标题并保存到Excel中?

  • 应用场景
  • 需求分析
  • 实现思路
  • 实现过程
    • 安装依赖库
    • 打开需求文件
    • 获取word中所有标题
    • 去除不需要的标题
    • 创建工作簿和工作表
    • 分割标题
    • 功能名称存入测试对象
    • GN-TC+需求标识符存入测试项标识
    • 存入需求标识符
  • 完整源码
  • 实现效果
  • 学习总结

应用场景

  • 为啥要提这个话题呢?测试小伙伴遇到一个问题,他的痛点是想把需求文档(word版)中的需求标识符、功能名称,挨个复制到测试计划中;

  • 这对他来说是非常痛苦的,如果需求文档内容过于庞大,对他来说,需要好几天才能复制完这些标识符;

  • 具体的比如以下word:
    在这里插入图片描述

  • 他想把以上word标题中的标识符和名称复制到如下表格中:

测试对象测试项标识需求标识
组织管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
组织管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
组织管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
组织管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
组织管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
  • 针对这个简单的需求如何用python来实现呢?

需求分析

  • 需求的标题为:序号+[标识符]+功能名称;
  • 测试计划中表格内容:
字段说明
测试对象对应需求中的功能名称
测试项标识GN-TC+需求中的标识符
需求标识符需求中的标识符
  • 经过分析,其实就是把需求中的标题提取出来,然后进行分割,分别写入测试计划对应的表格中即可。

实现思路

  • 打开指定目录下的需求文档;
  • 获取需求文档中的所有标题;
  • 当标题中只有符号“[” 和 "]"时列表;
  • 创建excel工作簿;
  • 新建工作表;
  • 给工作标添加表头,比如测试对象、测试项标识、需求标识;
  • 分割获取到的标题并存入excel对应的表头下。

实现过程

安装依赖库

  • 我们使用Python的python-docx库和openpyxl库进行以上内容实现;
  • 那么需要安装这两个库:
pip install python-docx
pip install openpyxl
  • 如果没有网络,需要在本地单独安装,python-docx有以下两个依赖 lxml和typing-extensions:
C:\Users\Administrator>pip install python-docx
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: python-docx in d:\python37\lib\site-packages (1.1.0)
Requirement already satisfied: lxml>=3.1.0 in d:\python37\lib\site-packages (from python-docx) (4.6.3)
Requirement already satisfied: typing-extensions in d:\python37\lib\site-packages (from python-docx) (4.7.1)
  • 如果没有网络,需要在本地单独安装,openpyxl有以下两个依赖 jdcal和 et-xmlfile:
C:\Users\Administrator>pip install openpyxl
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: openpyxl in d:\python37\lib\site-packages (3.0.5)
Requirement already satisfied: jdcal in d:\python37\lib\site-packages (from openpyxl) (1.4.1)
Requirement already satisfied: et-xmlfile in d:\python37\lib\site-packages (from openpyxl) (1.0.1)

打开需求文件

  • 需要导入对应的库;
  • 文件名称写自己的需求文件即可;
import docx
from openpyxl import Workbook

doc = docx.Document("./XX需求.docx")

获取word中所有标题

  • 先创建和列表用于存放标题;
headings = []

for para in doc.paragraphs:
    if para.style.name.startswith('Heading'):
       	headings.append(para.text)
print(headings)
  • 此时会输出所有的标题:
['XX管理系统', '[US-ADMIN]ADMIN', '[US-ADMIN-ZZGL]组织管理', 
'[US-ADMIN-ZZGL-YHGL]用户管理', '功能描述', '输入输出', 
'数据流向', '[US-ADMIN-ZZGL-JGYHGL]机构用户管理', '功能描述', 
'输入输出', '数据流向', ' [US-ADMIN-PZGL]配置管理', 
'[US-ADMIN-PZGL-ZZJG]组织机构', '功能描述', '输入输出', 
'数据流向', '[US-ADMIN-PZGL-GWXX]岗位信息', '功能描述', 
'输入输出', '数据流向', ' [US-ADMIN-PZGL-JSXX]角色信息',
 '功能描述', '输入输出', '数据流向', ' [US-AQGLY]SUPERADMIN',
  '[US-SUPERADMIN-XTPZ]系统配置', ' [US-SUPERADMIN-XTPZ-PZGL]配置管理',
   '功能描述', '输入输出', '数据流向', '[US-SUPERADMIN-YHPZ]用户配置',
    '[US-SUPERADMIN-YHPZ-YHJS]用户角色', '功能描述', '输入输出', 
    '数据流向', '[ US-SUPERADMIN-YHPZ-QXFP]权限分配', '功能描述', 
    '数据流向', '[US-SUPERADMIN-YHPZ-CZMM]重置密码', '功能描述', 
    '输入输出', '数据流向', '[US-SUPERADMIN-RZ]日志', '功能描述', 
    '输入输出', '数据流向']

去除不需要的标题

  • 以上获取所有标题后,有的不是我们想要的;
  • 比如功能描述、输入输出、数据流向等标题是不需要的;
  • 我们需要的标题是比如[US-SUPERADMIN-RZ]日志;
  • 标题获取后判断是否有符号“[” 和 “]”,如果有,再存入列表;
headings = []

for para in doc.paragraphs:
    if para.style.name.startswith('Heading'):
        if '[' in para.text or ']' in para.text:
            headings.append(para.text)
print(headings)
  • 此时就去掉了多余的标题内容:
['[US-ADMIN]ADMIN', '[US-ADMIN-ZZGL]组织管理', 
'[US-ADMIN-ZZGL-YHGL]用户管理', '[US-ADMIN-ZZGL-JGYHGL]机构用户管理', 
' [US-ADMIN-PZGL]配置管理', '[US-ADMIN-PZGL-ZZJG]组织机构',
 '[US-ADMIN-PZGL-GWXX]岗位信息', ' [US-ADMIN-PZGL-JSXX]角色信息', 
 ' [US-AQGLY]SUPERADMIN', '[US-SUPERADMIN-XTPZ]系统配置', 
 ' [US-SUPERADMIN-XTPZ-PZGL]配置管理', '[US-SUPERADMIN-YHPZ]用户配置', 
 '[US-SUPERADMIN-YHPZ-YHJS]用户角色', '[ US-SUPERADMIN-YHPZ-QXFP]权限分配', 
 '[US-SUPERADMIN-YHPZ-CZMM]重置密码', '[US-SUPERADMIN-RZ]日志']

创建工作簿和工作表

  • 创建一个工作簿;
  • 然后在工作簿中创建一个工作表;
  • 并在工作表中设置表头为测试对象、测试项标识、需求标识;
wb = Workbook()

sheet = wb.create_sheet("data")

# ws = wb.active
headers = ['测试对象', '测试项标识', '需求标识符']
for col_num, header in enumerate(headers, start=1):
    sheet.cell(row=1, column=col_num, value=header)

分割标题

  • 去掉标题中的左书名号"[";
  • 使用右书名号“]”进行分割,左边即为需求标识符,右边即为功能名称;
  • 拼接测试项标题为GN-TC+需求标识符:
c3 = []
c5 = []
c7 = []
for content in headings:
    c1 = content.strip('[')
    c2 = c1.split(']')[0]
    c3.append(c2)
    c4 = c1.split(']')[1]
    c5.append(c4)
    c6 = 'GN-TC-' + c2
    c7.append(c6)
    print(c1)
print(c3)
print(c5)
print(c7)
  • 其中c1为去掉所有左书名号:
US-ADMIN]ADMIN
US-ADMIN-ZZGL]组织管理
US-ADMIN-ZZGL-YHGL]用户管理
US-ADMIN-ZZGL-JGYHGL]机构用户管理
 [US-ADMIN-PZGL]配置管理
US-ADMIN-PZGL-ZZJG]组织机构
US-ADMIN-PZGL-GWXX]岗位信息
 [US-ADMIN-PZGL-JSXX]角色信息
 [US-AQGLY]SUPERADMIN
US-SUPERADMIN-XTPZ]系统配置
 [US-SUPERADMIN-XTPZ-PZGL]配置管理
US-SUPERADMIN-YHPZ]用户配置
US-SUPERADMIN-YHPZ-YHJS]用户角色
 US-SUPERADMIN-YHPZ-QXFP]权限分配
US-SUPERADMIN-YHPZ-CZMM]重置密码
US-SUPERADMIN-RZ]日志
  • c3所有需求标识符:
['US-ADMIN', 'US-ADMIN-ZZGL', 'US-ADMIN-ZZGL-YHGL',
 'US-ADMIN-ZZGL-JGYHGL', ' [US-ADMIN-PZGL', 'US-ADMIN-PZGL-ZZJG', 
 'US-ADMIN-PZGL-GWXX', ' [US-ADMIN-PZGL-JSXX', ' [US-AQGLY',
  'US-SUPERADMIN-XTPZ', ' [US-SUPERADMIN-XTPZ-PZGL', 'US-SUPERADMIN-YHPZ',
   'US-SUPERADMIN-YHPZ-YHJS', ' US-SUPERADMIN-YHPZ-QXFP', 
   'US-SUPERADMIN-YHPZ-CZMM', 'US-SUPERADMIN-RZ']
  • c5功能名称:
['ADMIN', '组织管理', '用户管理', '机构用户管理', 
'配置管理', '组织机构', '岗位信息', '角色信息', 
'SUPERADMIN', '系统配置', '配置管理', '用户配置', 
'用户角色', '权限分配', '重置密码', '日志']
  • c7测试项名称:
[
'GN-TC-US-ADMIN', 
'GN-TC-US-ADMIN-ZZGL', 
'GN-TC-US-ADMIN-ZZGL-YHGL', 
'GN-TC-US-ADMIN-ZZGL-JGYHGL', 
'GN-TC-US-ADMIN-PZGL', 
'GN-TC-US-ADMIN-PZGL-ZZJG', 
'GN-TC-US-ADMIN-PZGL-GWXX', 
'GN-TC-US-ADMIN-PZGL-JSXX', 
'GN-TC-US-AQGLY', 
'GN-TC-US-SUPERADMIN-XTPZ', 
'GN-TC-US-SUPERADMIN-XTPZ-PZGL', 
'GN-TC-US-SUPERADMIN-YHPZ', 
'GN-TC-US-SUPERADMIN-YHPZ-YHJS', 
'GN-TC-US-SUPERADMIN-YHPZ-QXFP', 
'GN-TC-US-SUPERADMIN-YHPZ-CZMM', 
'GN-TC-US-SUPERADMIN-RZ']

功能名称存入测试对象

for i, heading in enumerate(c5):
    sheet.cell(row=i+2, column=1, value=heading)

GN-TC+需求标识符存入测试项标识

for i, heading in enumerate(c7):
    sheet.cell(row=i+2, column=2, value=heading)

存入需求标识符

for i, heading in enumerate(c3):
    sheet.cell(row=i+2, column=3, value=heading)

完整源码

# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2024/5/23
# 文件名称:test_word.py

import docx
from openpyxl import Workbook

doc = docx.Document("./XX需求.docx")

headings = []

for para in doc.paragraphs:
    if para.style.name.startswith('Heading'):
        if '[' in para.text or ']' in para.text:
            headings.append(para.text)
# print(headings)

wb = Workbook()

sheet = wb.create_sheet("data")

# ws = wb.active
headers = ['测试对象', '测试项标识', '需求标识符']
for col_num, header in enumerate(headers, start=1):
    sheet.cell(row=1, column=col_num, value=header)

# print(headings)

c3 = []
c5 = []
c7 = []
for content in headings:
    c1 = content.strip('[')
    c2 = c1.split(']')[0]
    c3.append(c2)
    c4 = c1.split(']')[1]
    c5.append(c4)
    c6 = 'GN-TC-' + c2
    c7.append(c6)
#     print(c1)
# print(c3)
# print(c5)
# print(c7)

for i, heading in enumerate(c5):
    sheet.cell(row=i+2, column=1, value=heading)

for i, heading in enumerate(c7):
    sheet.cell(row=i+2, column=2, value=heading)

for i, heading in enumerate(c3):
    sheet.cell(row=i+2, column=3, value=heading)

wb.save('./data.xlsx')

实现效果

在这里插入图片描述

学习总结

以上还有优化的空间,比如:

  • 字符串中间有空格或者其他多余的内容如何处理?
  • 新建的excel如何对表头进行字体、颜色等设置?
  • 表格列宽如何调整?
  • 整个表格字体如何设置?
    等等。

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

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

相关文章

交换机的三层交换技术

现有pc1与pc2不在同一个网段之下,通过交换机相连接。 进人交换机1,创建两个vlan 10和vlan 20 ,进入串口2设置串口模式为access,并且设置默认vlan为10.进入串口3设置串口模式为access,并且设置默认vlan为20. 进入串口1…

学习笔记——动态路由协议——OSPF(OSPF基本术语)

OSPF基本术语 1、链路状态(LS)与链路状态通告(LSA) 链路(LINK):路由器上的一个接口。 状态(State):描述接口以及其与邻居路由器之间的关系。 (1)链路状态(LS) OSPF是一种链路状态协议,所谓的链路状态,其实就是路由器的接口状态…

Java-数组内存解析

文章目录 1.内存的主要结构:栈、堆2.一维数组的内存解析3.二维数组的内存解析 1.内存的主要结构:栈、堆 2.一维数组的内存解析 举例1:基本使用 举例2:两个变量指向一个数组 3.二维数组的内存解析 举例1: 举例2&am…

Thingsboard规则链:Calculate Delta节点详解

在物联网(IoT)应用中,对设备数据的实时分析和处理是优化运营、预测维护的关键。Thingsboard作为一款功能强大的物联网平台,其规则引擎提供了丰富的节点来处理和分析数据流。其中,Calculate Delta节点是一个重要的工具,用于计算连续…

HAL库+LWIP+LAN8720+热插拔

定时任务中,查询LAN8720的状态寄存器 PHY_BSR 0x01,成功读取后,检查16位数据的BIT2,即可获取网线连接状态 uint32_t phyreg 0;if(HAL_ETH_ReadPHYRegister(&g_eth_handler, PHY_BSR, &phyreg) HAL_OK){if(((phyreg >…

电脑显示不出网络

你的电脑是否在开机后显示不出网络,或者有网络消失的现象?今天和大家分享我学到的一个办法,希望对大家有用。 分析出现这类现象的原因:可能是电脑网卡松动了,电脑中存在静电流。 解决办法:先将电脑关机&am…

20 VUE学习:插件

介绍 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。下面是如何安装一个插件的示例: import { createApp } from vueconst app createApp({})app.use(myPlugin, {/* 可选的选项 */ })一个插件可以是一个拥有 install() 方法的对象,也可以直接…

全文最详细的生产管理完整方案!那些让人头疼的生产管理难题及解决方法!

什么是生产管理系统?为何生产管理系统在企业管理中如此重要?生产管理系统的核心模块包括哪些?为何企业在生产管理系统中常常遭遇项目信息碎片化、任务分配和跟踪困难等痛点?又该如何针对生产管理痛点进行优化? 本文40…

【数据结构与算法 | 基础篇 | 队列篇】力扣102, 107

1. 力扣102 : 二叉树的层序遍历 (1). 题 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3]…

Nginx教程(持续更新中~)

浏览器优先查看host文件中的映射,如果host中没有就会从网上CDN找该域名对应的ip,但是目前使用的www.123.com是外卖假设的,CDN中并没有,所以就采用host中填写 第二种weight: 第三种 ip_hash: 第四种 fair: ​​​​​​

AWS 高防和阿里云高防深度对比

随着网络攻击的不断增加,企业对于网络安全的需求也越来越高。在这种情况下,高防护服务成为了企业网络安全的重要组成部分。AWS和阿里云作为全球领先的云计算服务提供商,都提供了高防护服务,但它们之间存在着一些差异。我们九河云一…

Idea java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space 解决

咱们平时的开发过程中一定会进行本地调试,今天我也是安装了新的idea之后拉了一个比较大的项目进行本地调试的时候报错。报错信息如下: java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Ja…

【火猫CS2】fantic取代C9参加YaLLa指南针

1、近日YaLLa Compass主办方宣布,由于Could9战队未能在截止日期前提交完整的参赛阵容,fantic战队将取代其参赛。该比赛将在阿联酋阿布扎比举行,总奖金40万美元。 最近一段时间Cloud9战队最近将electroNic转会至VP,又下放了HObbit和Perfecto,队伍因没有完整阵容已被迫退出EPL S1…

了解VS安全编译选项GS

缓冲区溢出攻击的基本原理就是溢出时覆盖了函数返回地址,之后就会去执行攻击者自己的函数; 针对缓冲区溢出时覆盖函数返回地址这一特征,微软在编译程序时使用了安全编译选项-GS; 目前版本的Visual Studio中默认启用了这个编译选项…

开源代码分享(31)-计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

参考文献: [1]孙惠娟,刘昀,彭春华,等.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度[J].电网技术,2021,45(09):3534-3545.DOI:10.13335/j.1000-3673.pst.2020.1720. 1.摘要 为了促进多能源互补及能源低碳化,提出了计及电转气协同的含碳捕集与垃…

CSS浮动详细教学(CSS从入门到精通学习第四天)

css第04天 一、其他样式 1、圆角边框 在 CSS3 中,新增了圆角边框样式,这样我们的盒子就可以变圆角了。 border-radius 属性用于设置元素的外边框圆角。 语法: border-radius:length; 参数值可以为数值或百分比的形式如果是正方形&…

Javaweb基础之Filter

大家好,这里是教授.F 引入: 为什么需要过滤器???我们在访问一个项目的时候,常常有很多页面,如果没有过滤器,则我们需要在用户访问一个页面的时候,都要进行一个校验&…

英飞凌 AURIX TriCore 单片机开发入门

文章目录 目的硬件准备AURIX™ Development StudioInfineon MemtoolAURIX™ iLLD Drivers总结 目的 英飞凌的32位 AURIX™ TriCore™ 系列单片机 经常用于汽车和工业领域。开发该系列单片机比较常用的开发环境有 HighTec 和 AURIX™ Development Studio 。本文将基于后者&…

SqlSession是什么?在MyBatis-Spring中有什么应用?

目录 一、SqlSession是什么 二、SqlSession在MyBatis中的应用 三、SqlSession在Spring中的应用 一、SqlSession是什么 SqlSession 是 MyBatis 框架中的一个核心概念,它代表与数据库的一次会话。MyBatis 是一个流行的 Java 持久层框架,用于简化数据库…

生成随机数值与二维数组的探索之旅

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、随机数生成的策略 三、实现过程与代码案例 四、注意事项与扩展讨论 一、引言…