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

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

应用场景

  • 为啥要提这个话题呢?测试小伙伴遇到一个问题,他的痛点是想把需求文档(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如何对表头进行字体、颜色等设置?
  • 表格列宽如何调整?
  • 整个表格字体如何设置?
    等等。
相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
3月前
|
XML 数据格式 Python
从手动编辑到代码生成:Python 助你高效创建 Word 文档
本文介绍如何用Python实现Word文档自动化生成,结合python-docx、openpyxl和matplotlib库,高效完成报告撰写、数据插入与图表生成,大幅提升办公效率,降低格式错误,实现数据驱动的文档管理。
697 2
|
6月前
|
XML Linux 区块链
Python提取Word表格数据教程(含.doc/.docx)
本文介绍了使用LibreOffice和python-docx库处理DOC文档表格的方法。首先需安装LibreOffice进行DOC到DOCX的格式转换,然后通过python-docx读取和修改表格数据。文中提供了详细的代码示例,包括格式转换函数、表格读取函数以及修改保存功能。该方法适用于Windows和Linux系统,解决了老旧DOC格式文档的处理难题,为需要处理历史文档的用户提供了实用解决方案。
821 0
|
5月前
|
监控 Linux 数据安全/隐私保护
Python实现Word转PDF全攻略:从入门到实战
在数字化办公中,Python实现Word转PDF自动化,可大幅提升处理效率,解决格式兼容问题。本文详解五种主流方案,包括跨平台的docx2pdf、Windows原生的pywin32、服务器部署首选的LibreOffice命令行、企业级的Aspose.Words,以及轻量级的python-docx+pdfkit组合。每种方案均提供核心代码与适用场景,并涵盖中文字体处理、表格优化、批量进度监控等实用技巧,助力高效办公自动化。
1489 0
|
6月前
|
Python
Python 办公实战:用 python-docx 自动生成 Word 文档
本文详解如何使用 python-docx 库实现 Word 文档自动化生成,涵盖环境搭建、文档创建、格式设置、表格与图片处理、模板填充、批量生成及性能优化等实战技巧,助你高效完成办公场景中的文档自动化任务。
1858 1
|
8月前
|
供应链 API 开发者
1688 商品数据接口终极指南:Python 开发者如何高效获取标题 / 价格 / 销量数据(附调试工具推荐)
1688商品列表API是阿里巴巴开放平台提供的服务,允许开发者通过API获取1688平台的商品信息(标题、价格、销量等)。适用于电商选品、比价工具、供应链管理等场景。使用时需构造请求URL,携带参数(如q、start_price、end_price等),发送HTTP请求并解析返回的JSON/XML数据。示例代码展示了如何用Python调用该API获取商品列表。
446 18
|
6月前
|
Web App开发 人工智能 数据可视化
猫头虎 推荐:国产开源AI工具 爱派(AiPy)|支持本地部署、自动化操作本地文件的AI办公神器
爱派(AiPy)是一款国产开源AI工具,支持本地部署与自动化操作,助力数据处理与办公效率提升。基于Python Use理念,AiPy让AI直接控制本地文件,简化繁琐任务,提供高效智能的解决方案,适用于数据工程师、分析师及日常办公用户。
2873 0
|
6月前
|
安全 数据库 数据安全/隐私保护
Python办公自动化实战:手把手教你打造智能邮件发送工具
本文介绍如何使用Python的smtplib和email库构建智能邮件系统,支持图文混排、多附件及多收件人邮件自动发送。通过实战案例与代码详解,帮助读者快速实现办公场景中的邮件自动化需求。
610 0
|
6月前
|
前端开发 安全 Java
办公自动化必修课:用Python打造PDF全能处理工具
在职场中,PDF处理常令人崩溃:拆分、合并、加密等问题严重影响效率。本文教你用Python打造一个包含拆分、合并、加密、水印四大功能的PDF工具箱,通过实战代码提升办公自动化水平,让文档操作像拼乐高一样简单高效。
227 0
|
9月前
|
人工智能 安全 虚拟化
Cua:Mac用户狂喜!这个开源框架让AI直接接管你的电脑,快速实现AI自动化办公
Cua是一个结合高性能虚拟化与AI代理能力的开源框架,能在Apple Silicon上以接近原生性能运行虚拟机,并让AI直接操作系统应用。
1528 17
Cua:Mac用户狂喜!这个开源框架让AI直接接管你的电脑,快速实现AI自动化办公
|
存储 数据处理 索引
Python操作Excel常用方法汇总
Python操作Excel常用方法汇总
563 0

热门文章

最新文章

推荐镜像

更多