办公自动化-Python如何提取Word标题并保存到Excel中?
办公自动化-Python如何提取Word标题并保存到Excel中?
- 应用场景
- 需求分析
- 实现思路
- 实现过程
- 安装依赖库
- 打开需求文件
- 获取word中所有标题
- 去除不需要的标题
- 创建工作簿和工作表
- 分割标题
- 功能名称存入测试对象
- GN-TC+需求标识符存入测试项标识
- 存入需求标识符
- 完整源码
- 实现效果
- 学习总结
应用场景
-
为啥要提这个话题呢?测试小伙伴遇到一个问题,他的痛点是想把需求文档(word版)中的需求标识符、功能名称,挨个复制到测试计划中;
-
这对他来说是非常痛苦的,如果需求文档内容过于庞大,对他来说,需要好几天才能复制完这些标识符;
-
具体的比如以下word:
-
他想把以上word标题中的标识符和名称复制到如下表格中:
测试对象 测试项标识 需求标识 组织管理 GN-TC-US-ADMIN-ZZGL US-ADMIN-ZZGL 组织管理 GN-TC-US-ADMIN-ZZGL US-ADMIN-ZZGL 组织管理 GN-TC-US-ADMIN-ZZGL US-ADMIN-ZZGL 组织管理 GN-TC-US-ADMIN-ZZGL US-ADMIN-ZZGL 组织管理 GN-TC-US-ADMIN-ZZGL US-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如何对表头进行字体、颜色等设置?
- 表格列宽如何调整?
- 整个表格字体如何设置?
等等。
- c7测试项名称:
- c5功能名称:
- c3所有需求标识符:
- 其中c1为去掉所有左书名号:
- 此时就去掉了多余的标题内容:
- 此时会输出所有的标题:
- 先创建和列表用于存放标题;
- 如果没有网络,需要在本地单独安装,openpyxl有以下两个依赖 jdcal和 et-xmlfile:
- 如果没有网络,需要在本地单独安装,python-docx有以下两个依赖 lxml和typing-extensions:
- 经过分析,其实就是把需求中的标题提取出来,然后进行分割,分别写入测试计划对应的表格中即可。
- 针对这个简单的需求如何用python来实现呢?
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!


