当前位置: 首页 > news >正文

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

办公自动化-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 Workbookdoc = 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-' + c2c7.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.pyimport docx
from openpyxl import Workbookdoc = 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-' + c2c7.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如何对表头进行字体、颜色等设置?
  • 表格列宽如何调整?
  • 整个表格字体如何设置?
    等等。

相关文章:

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

办公自动化-Python如何提取Word标题并保存到Excel中? 应用场景需求分析实现思路实现过程安装依赖库打开需求文件获取word中所有标题去除不需要的标题创建工作簿和工作表分割标题功能名称存入测试对象GN-TC需求标识符存入测试项标识存入需求标识符 完整源码实现效果学…...

基于Java、SpringBoot和uniapp在线考试系统安卓APP和微信小程序

摘要 基于Java、SpringBoot和uniapp的在线考试系统安卓APP微信小程序是一种结合了现代Web开发技术和移动应用技术的解决方案,旨在为教育机构提供一个方便、高效和灵活的在线考试平台。该系统采用Java语言进行后端开发,使用SpringBoot框架简化企业级应用…...

抖音a-bogus加密解析(三)

要补的环境我给提示,大家自行操作,出了问题就是因为缺环境,没补好 window global; // reading _u未定义 window.requestAnimationFrame function () {} // XMLHttpRequest 未定义 window.XMLHttpRequest function () {} window.onwheelx …...

IS-IS DIS

原理概述 OSPF 协议支持4种网络类型, IS-IS 协议只支持两种网络类型,即广播网络和点到点网络。与 OSPF 协议相同, IS-IS 协议在广播网络中会将网络视为一个伪节点( Pseudonode ,简称 PSN ),并选举出一台 DIS ( Designa…...

random和range

含义: random(1,10) 不包含10,用于生成随机数。它可以生成浮点数或整数,取决于具体的使用方式。 range(0,1) 不包含1,用于生成一个整数序列。它可以生成一个指定范围内的连续整数序列。 区别在于&#x…...

研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?

一、写在开头 今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工作毫无问题&#x…...

Golang:gammazero/deque是一个快速环形缓冲区deque(双端队列)实现

gammazero/deque是一个快速环形缓冲区deque(双端队列)实现。 文档 https://github.com/gammazero/deque 安装 go get github.com/gammazero/deque代码示例 先入先出队列 package mainimport ("fmt""github.com/gammazero/deque&quo…...

C++ 时间处理-统计函数运行时间

1. 关键词2. 问题3. 解决思路4. 代码实现 4.1. timecount.h4.2. timecount.cpp 5. 测试代码6. 运行结果7. 源码地址 1. 关键词 C 时间处理 统计函数运行时间 跨平台 2. 问题 C如何简单便捷地实现“函数运行时间的统计”功能? 3. 解决思路 类的构造函数&#x…...

JAVA面试题大全(十五)

1、Zookeeper 是什么? zookper是一个分布式的,开放源码的分布式应用程序协调服务。是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护…...

使用python对指定文件夹下的pdf文件进行合并

使用python对指定文件夹下的pdf文件进行合并 介绍效果代码 介绍 对指定文件夹下的所有pdf文件进行合并成一个pdf文件。 效果 要合并的pdf文件,共计16个1页的pdf文件。 合并成功的pdf文件:一个16页的pdf文件。 代码 import os from PyPDF2 import …...

Day50 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结

代码随想录算法训练营Day50 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结 LeetCode 309.最佳买卖股票时机含冷冻期 题目链接:LeetCode 309.最佳买卖股票时机含冷冻期 思路: 四个状态。 保持持有股票,保持卖出股票…...

Steam在连接至服务器发生错误/连接服务器遇到问题解决办法

Steam作为全球最大的数字游戏分发平台,构建了一个活跃的玩家社区,用户可以创建个人资料,添加好友,组建群组,参与讨论,甚至直播自己的游戏过程。通过创意工坊,玩家还能分享自制的游戏模组、地图、…...

kafka 工作流程文件存储

爬虫组件分析 目录概述需求: 设计思路实现思路分析1.kafka 工作流程2.kafka 文件存储 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for…...

贪心算法4(c++)

过河的最短时间 题目描述 输入 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过,如果…...

【无标题】yoloV8目标检测与实例分割--目标检测onnx模型部署

1. 模型转换 ONNX Runtime 是一个开源的高性能推理引擎,用于部署和运行机器学习模型,其设计的目标是优化执行open neural network exchange (onnx)格式定义各模型,onnx是一种用于表示机器学习模型的开放标准。ONNX Ru…...

深入理解与防御跨站脚本攻击(XSS):从搭建实验环境到实战演练的全面教程

跨站脚本攻击(XSS)是一种常见的网络攻击手段,它允许攻击者在受害者的浏览器中执行恶意脚本。以下是一个XSS攻击的实操教程,包括搭建实验环境、编写测试程序代码、挖掘和攻击XSS漏洞的步骤。 搭建实验环境 1. 安装DVWA&#xff…...

初步认识栈和队列

Hello,everyone,今天小编讲解栈和队列的知识!!! 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&…...

插件:NGUI

一、版本 安装完毕后重启一下即可,否则可能创建的UI元素不生效 二、使用 Label文字 1、创建Canvs 2、只有根节点的这些脚本全部展开才能鼠标右键创建UI元素 3、选择字体 Label添加打字效果 Sprite图片 1、选择图集 2、选择图集中的精灵 InvisibleWidget容器 用来…...

网络爬虫原理及其应用

你是否想知道Google 和 Bing 等搜索引擎如何收集搜索结果中显示的所有数据。这是因为搜索引擎对其档案中的所有页面建立索引,以便它们可以根据查询返回最相关的结果。网络爬虫使搜索引擎能够处理这个过程。 本文重点介绍了网络爬虫的重要方面、网络爬虫为何重要、其…...

串口中断原理及实现

一、串口的原理 SM0、SM1——串行口工作模式 SM0SM1模式特点00模式0移位寄存器方式,用于I/O口扩展01模式18位UART,波特率可变10模式29位UART,波特率为时钟频率/32或/6411模式39位UART,波特率可变 TI、RI——发送、接收中断标志位 TITI0 允许发送>TI1 发送完成后…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...