腾讯云可以做网站吗,网站建设材料,如何搭建个人网站,租房网站模板办公自动化-Python如何提取Word标题并保存到Excel中#xff1f; 应用场景需求分析实现思路实现过程安装依赖库打开需求文件获取word中所有标题去除不需要的标题创建工作簿和工作表分割标题功能名称存入测试对象GN-TC需求标识符存入测试项标识存入需求标识符 完整源码实现效果学… 办公自动化-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\Administratorpip 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: lxml3.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\Administratorpip 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, start1):sheet.cell(row1, columncol_num, valueheader)分割标题
去掉标题中的左书名号[使用右书名号“]”进行分割左边即为需求标识符右边即为功能名称拼接测试项标题为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(rowi2, column1, valueheading)GN-TC需求标识符存入测试项标识
for i, heading in enumerate(c7):sheet.cell(rowi2, column2, valueheading)存入需求标识符
for i, heading in enumerate(c3):sheet.cell(rowi2, column3, valueheading)完整源码
# -*- 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, start1):sheet.cell(row1, columncol_num, valueheader)# 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(rowi2, column1, valueheading)for i, heading in enumerate(c7):sheet.cell(rowi2, column2, valueheading)for i, heading in enumerate(c3):sheet.cell(rowi2, column3, valueheading)wb.save(./data.xlsx)实现效果 学习总结
以上还有优化的空间比如
字符串中间有空格或者其他多余的内容如何处理新建的excel如何对表头进行字体、颜色等设置表格列宽如何调整整个表格字体如何设置 等等。