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

2024-05-30 1254阅读

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

  • 应用场景
  • 需求分析
  • 实现思路
  • 实现过程
    • 安装依赖库
    • 打开需求文件
    • 获取word中所有标题
    • 去除不需要的标题
    • 创建工作簿和工作表
    • 分割标题
    • 功能名称存入测试对象
    • GN-TC+需求标识符存入测试项标识
    • 存入需求标识符
    • 完整源码
    • 实现效果
    • 学习总结

      应用场景

      • 为啥要提这个话题呢?测试小伙伴遇到一个问题,他的痛点是想把需求文档(word版)中的需求标识符、功能名称,挨个复制到测试计划中;

      • 这对他来说是非常痛苦的,如果需求文档内容过于庞大,对他来说,需要好几天才能复制完这些标识符;

      • 具体的比如以下word:

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

      • 他想把以上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 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')
                                            

                                            实现效果

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

                                            学习总结

                                            以上还有优化的空间,比如:

                                            • 字符串中间有空格或者其他多余的内容如何处理?
                                            • 新建的excel如何对表头进行字体、颜色等设置?
                                            • 表格列宽如何调整?
                                            • 整个表格字体如何设置?

                                              等等。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]