首页 > 编程语言 >python3实现xmind用例转excel

python3实现xmind用例转excel

时间:2024-03-11 20:22:53浏览次数:35  
标签:case title Worksheet excel 用例 xmind root

  1 import xmindparser
  2 import xlwt, xlrd
  3 from xlutils.copy import copy
  4 from xlwt import Worksheet
  5 from xmindparser import xmind_to_dict
  6 import datetime
  7 import os
  8 import re
  9 import traceback
 10 
 11 # 当前时间戳
 12 a = datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S')
 13 timestp = re.sub(r'-|:|\s', '', str(a))
 14 
 15 # 根目录
 16 base_dir = os.path.abspath(os.path.dirname(__file__))
 17 
 18 # xmindparser配置
 19 xmindparser.config = {
 20     'showTopicId': False,  # 是否展示主题ID
 21     'hideEmptyValue': True  # 是否隐藏空值
 22 }
 23 
 24 
 25 def traversal_xmind(root, rootstring, lisitcontainer, flag):
 26     """
 27     功能:递归dictionary文件得到容易写入Excel形式的格式。
 28     注意:rootstring都用str来处理中文字符
 29     @param root: 将xmind处理后的dictionary文件
 30     @param rootstring: xmind根标题
 31     @param lisitcontainer: list容器存放数据
 32     @param flag: 特殊标记标签
 33     """
 34     try:
 35         # 判断数据是否是字典类型
 36         if isinstance(root, dict):
 37             print('root1:', root)
 38             # 如果这个字典的key中同时有title和topics,则可认为这个title有下级分支
 39             if 'title' in root.keys() and 'topics' in root.keys():
 40                 traversal_xmind(root['topics'], str(rootstring), lisitcontainer, True)
 41             # 如果这个字典的key中有title且没有topics,则可认为这个title是最末端
 42             if 'title' in root.keys() and 'topics' not in root.keys():
 43                 traversal_xmind(root['title'], str(rootstring), lisitcontainer, True)
 44 
 45         # 判断数据是否是列表类型
 46         elif isinstance(root, list):
 47             #
 48             flag = True
 49             # 遍历列表
 50             for sonroot in root:
 51                 # sonroot只可能是dict类型
 52                 # 如果这个字典的key中同时有title和topics,则可认为这个title有下级分支
 53                 if flag:
 54                     if 'title' in sonroot.keys() and 'topics' in sonroot.keys():
 55                         traversal_xmind(sonroot['topics'], str(rootstring) + "!" + sonroot['title'], lisitcontainer,
 56                                         True)
 57                     # 如果这个字典的key中有title且没有topics,则可认为这个title是最末端
 58                     elif 'title' in sonroot.keys() and 'topics' not in sonroot.keys():
 59                         # # 判断蓝色感叹号标识(前置条件)是否存在
 60                         if 'makers' in sonroot.keys() and 'symbol-info' in sonroot['makers']:
 61                             case = str(rootstring) + "!" + root[0]['title'] + "!" + root[1]['title'] + "!" + \
 62                                    root[1]['topics'][0]['title']
 63                             # 如果有特殊标签,则改变flag状态
 64                             flag = False
 65                             traversal_xmind(case, case, lisitcontainer, flag)
 66                         else:
 67                             case = str(rootstring) + "!" + sonroot['title']
 68                             traversal_xmind(case, case, lisitcontainer, True)
 69 
 70         # 判断数据是否是字符串类型
 71         elif isinstance(root, str):
 72             # lisitcontainer.append(str(rootstring.replace('\n', '')))  # 此处是去掉一步骤多结果情况直接拼接
 73             lisitcontainer.append(str(rootstring))  # 此处是一步骤多结果时,多结果合并
 74             # print('lisitcontainer:', lisitcontainer)
 75     except:
 76         tips = 'xmind处理异常,请联系Dora!!!'
 77         # 输出异常信息
 78         traceback.print_exc()
 79 
 80 # 将xmind中的每条用例提取出来,放入列表中,以逗号分隔
 81 def get_case(root):
 82     rootstring = root['title']
 83     lisitcontainer = []
 84     traversal_xmind(root, rootstring, lisitcontainer, True)
 85     return lisitcontainer
 86 
 87 # 写入第b行的用例数据内容
 88 def write_sheet(Worksheet, b, casename, casestep, expectresult):
 89     '''
 90     功能解释:去掉用例中的换行符,写入一条用例到Excel中
 91     @param Worksheet: excel表对象
 92     @param b: 写入的数据在表中所处的行数
 93     @param casename: 用例名称
 94     @param casestep: 用例操作
 95     @param expectresult: 期望结果
 96     '''
 97     # 用例名称
 98     caseName = re.sub(r'\r\n', '', str(casename))
 99     # 用例步骤
100     caseStep = re.sub(r'\r\n', '', str(casestep))
101     # 期望结果
102     expectResult = re.sub(r'\r\n', '', str(expectresult))
103     Worksheet.write(b, 0, caseName)  # 用例名称
104     Worksheet.write(b, 1, caseStep)  # 用例步骤
105     Worksheet.write(b, 2, expectResult)  # 预期结果
106 
107 # 处理xmind数据
108 def deal_with_list(Worksheet, case_list):
109     '''
110     功能解释:处理从xmind转换过来的用例list,并写入Excel中
111     @param Worksheet: excel表对象
112     @param case_list: 通过xmind转换好的用例列表
113     '''
114     tips = 'excel表格处理成功!!!'
115 
116     b = 1  # 记录写了多少行
117     for row_case in case_list:
118         case = row_case.split("!")  # 用‘!’分隔,存在list中,这是一条用例
119         caselength = len(case)
120         try:
121             if '前置条件' in row_case:
122                 casename = ''
123                 for i in range(0, caselength - 3):
124                     casename += case[i]  # 用例标题,(默认为从倒数第4个下标往前都是用例标题)
125                 casestep = case[-3] + case[-2]  # 用例步骤,(倒数第2个下标是步骤,倒数第3个下标识前置条件(必须有前置条件)
126                 expectresult = case[-1]  # 预期结果,(倒数第1个下标是预期结果)
127                 write_sheet(Worksheet, b, casename, casestep, expectresult)  # 写入Excel
128 
129             else:
130                 casename = ''
131                 for i in range(0, caselength - 2):
132                     casename += case[i]  # 用例标题,(无前置条件的情况下,默认为从倒数第3个下标往前都是用例标题)
133                 casestep = case[-2]  # 用例步骤,(倒数第2个下标是步骤)
134                 expectresult = case[-1]  # 预期结果,(倒数第1个下标是预期结果)
135                 # print(expectresult)
136                 write_sheet(Worksheet, b, casename, casestep, expectresult)  # 写入Excel
137         except:
138             tips = 'excel表格处理异常,请联系Dora!!!'
139             print('异常tips:', tips)
140             # 输出异常信息
141             traceback.print_exc()
142         b = b + 1
143     return tips
144 
145 def xmindToexcelfile(uploadPath):
146     # 创建一个Workbook对象 编码encoding
147     Workbook = xlwt.Workbook(encoding='utf-8', style_compression=0)
148     # 添加一个sheet工作表、sheet名命名为Sheet1、cell_overwrite_ok=True允许覆盖写
149     Worksheet = Workbook.add_sheet('Sheet1', cell_overwrite_ok=True)
150     Worksheet.write(0, 0, '用例名称')
151     Worksheet.write(0, 1, '操作步骤')
152     Worksheet.write(0, 2, '预期结果')
153     root = xmind_to_dict(uploadPath)[0]['topic']  # 解析成dict数据类型xmindparser.xmind_to_dict(filePath)
154     print('root:', root)
155     case_list = get_case(root)
156     print('case:', case_list)
157     tips = deal_with_list(Worksheet, case_list)
158     # Excel表保存的文件名字
159     savepath = os.path.abspath(os.path.dirname(__file__)) + '\\excelFiles\\' + root["title"] + timestp + ".xls"
160     Workbook.save(savepath)  # 此处可以填写生成文件的路径
161     return tips
162 
163 xmindToexcelfile('中心主题.xmind')

目录结构:

 

XMIND用例截图:

 

 转化用例截图:

 

标签:case,title,Worksheet,excel,用例,xmind,root
From: https://www.cnblogs.com/doradora/p/18066964

相关文章

  • 一文搞定POI,再也不怕excel导入导出了
    写在前面在Java日常开发过程中,实现Excel文件的导入导出功能是一项常见的需求。通过使用相关的Java库,如ApachePOI、EasyPoi或EasyExcel,可以轻松地实现Excel文件的读写操作。而这篇文章将介绍如何在Java中使用ApachePOI、EasyPoi和EasyExcel库来进行Excel文件的导入和导出操作......
  • 仅需10秒!ChatGPT轻松画出UML用例图,我却苦战10分钟。
    当我们写技术文档时,一张系统用例图,平时要花费10分钟才完成,而ChatGPT绘图过程只用了10秒钟,基本可以达到同样的水平,通过ChatGPT可以显著提高画流程图的效率。什么是用例图用例图是统一建模语言(UML)的一部分,用于描述系统的功能以及与之交互的外部实体(如人、系统或设备)。它是一种图......
  • EasyExcel动态单元格合并(跨行或跨列)
    EasyExcel动态单元格合并(跨行或跨列)简单的合并单元格可以参照官网提供的@OnceAbsoluteMerge()和@ContentLoopMerge()两个注解进行@OnceAbsoluteMerge()注解只会合并一次就不再执行了动态相同值合并单元格代码示例(可以直接使用):先看结果:开启合并列行合并单元格,指定1......
  • 解决easyexcel合并单元格数组求和重复问题
    背景EasyExcel(根据条件动态合并单元格的重复数据))_Violet-CSDN博客_easyexcel动态合并单元格现有的订单导出是使用的easyExcel完成的.对于相同单元格的合并是自定义的策略,问题是对于重复单元格的值会合并,表格求和时值会虚高现需要对合并格做修改,做到值只有一个。思路sheet合并......
  • EasyExcel合并行处理并优化
    业务场景由于业务需要导出如下图中订单数据和订单项信息,而一个订单对应多个订单项,所以会涉及到自定义合并行 1.简单处理项目使用的EasyExcel,经查找发现Excel种有个AbstractMergeStrategy抽象类,可以用于合并单元格。于是先简单的写一个工具类实现根据数据自定义合并单元行,基本......
  • 工作常用的EXCEL公式 | 将一个字符串中的文本和数字进行拆分
    需求:将A列拆分成B、C列 公式:=LEFT(A2,2*LEN(A2)-LENB(A2))=RIGHT(A2,LENB(A2)-LEN(A2)) 函数用法说明: ......
  • 自动化测试之excel操作
    1.fromopenpyxlimportload_workbook2.有三个对象,wb=load_workbook()--获取工作簿对象,s=wb['sheet']--获取sheet页对象,s.cell(2,2)---获取2行2列中的一个值3.每一行数据,存储在字典当中,一行代码一个测试用例数据1)key:value  2)key:遍历第一行 3)titles=[ ] forc......
  • 把图片插在excel单元格里
    本文以WPS专业版举例1、如下图,选择对应的单元格 2、通过“插入”菜单插入图片或直接粘贴图片3、如下图,对插入的图片点击鼠标右键,选择“切换为嵌入单元格图片”4、完成 ......
  • python用win32com.client驱动excel时如何控制是否更新链接?
    python中Pywin32库的win32com.clien模块在驱动Excel时有诸多好处:1、可以决定是否显式地打开Excel应用,调试的时候所见即所得;2、可以用近乎一样的VBA语法,几乎能实现VBA可以实现的所有功能;3、它甚至也支持直接调用Excel中已经写好的宏文件。那它有什么缺点呢?我觉得最主要......
  • Python正则表达式的语句具体的实用例子_2
    importres="""<divclass='jay'><spanid='1'>周杰伦</span></div><divclass='augus'><spanid='2'>马宁</span></div><divclass='tom'><s......