深圳正规做网站的公司云商城app官方下载
办公自动化-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 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如何对表头进行字体、颜色等设置?
 - 表格列宽如何调整?
 - 整个表格字体如何设置?
等等。 
