最近接到一个领导需求,将xmind脑图直接转成可以导入的excel用例,并且转换成gui可执行的exe文件,方便他人使用。

       因为对Python比较熟悉,所以就想使用Python3来实现这个功能,先理一下思路,首先要将xmind转换成Python可用的数据格式,正好找到了一个xmindparser库可以做这个事情,然后就好办了,用xlwt库写成xls文件,再用Python自带的gui库 tkinter来写 gui界面,最后用pyinstaller来打包。

        计划分两个py文件来写,一个文件写excel ,一个文件写gui界面,因为需要导入的字段比较多,而且导入的格式有严格的要求,所以写excel的逻辑还是有点复杂的,所以我们确定xmind的文件有相应的格式来写,测试编号 测试需求 测试用例标题 测试用例执行步骤 测试用例预期结果 测试用例预置条件都要按照相应的格式来。格式如图

python将bartender转化成pdf python将pdf转成excel_Python

通过xmindparser解析出来的格式是这样的,是Python的字典加列表的格式

python将bartender转化成pdf python将pdf转成excel_Python_02

从这里我们可以分析出来xmind的格式的两个属性是我们用的,title 和topics ,其中title是我们要的内容,topics是内容的个数,这里可以封装两个函数来用,代码我贴出来,因为要求的xls格式不一样
所以具体的逻辑还要具体的去写,我是按照我们工具要求的excel格式来写的,可以给大家参考一下,你们需要什么格式可以在write_excel函数里面调整逻辑.
下一篇再把tkinter设计的gui代码以及如何用pyintaller打包成exe贴上来。注:以下代码都是在Python3环境下的
1 from xmindparser import xmind_to_dict
 2 import re
 3 import xlwt
 4 
 5 class xmind_to_xls():
 6     def xmind_num(self,value):
 7         """获取xmind标题个数"""
 8         try:
 9             return len(value['topics'])
10         except KeyError:
11             return 0
12 
13     def xmind_title(self,value):
14         """获取xmind标题内容"""
15         return value['title']
16 
17     def  xmind_cat(self,filename):
18         '''调试函数,打印内容用的'''
19         self.out = xmind_to_dict(filename)
20         self.story = self.out[0]['topic']['topics']
21         self.num=len(self.story)
22         print(self.out)
23         print(self.out[0]['topic']['title'])
24         return self.story,self.num
25 
26     def write_excel(self,xmind_file,servicename='',editionname='',performer=''):
27         '''生成excel文件函数'''
28         self.f=xlwt.Workbook()
29         self.sheet1 =self.f.add_sheet('sheet1',cell_overwrite_ok=True)
30         self.row0 = ["storyid", '需求名称', '测试用例名称', '执行步骤', '预期结果', '服务名称', '版本', '执行人员']
31         #生成第一行
32         for i in range(0,len(self.row0)):
33             self.sheet1.write(0,i,self.row0[i])
34         self.out = xmind_to_dict(xmind_file)
35         self.xls_name=self.out[0]['topic']['title']
36         self.story = self.out[0]['topic']['topics']
37         self.storynum = len(self.story)
38         j=1 #用例计算器
39         z = 0  # 用例结果数计数器
40         for i in range(0, self.storynum):
41             self.storyname = self.story[i]['title']
42             print(self.storyname)
43             self.regex_str = ".*[\[【](.+?)[\]】].*"
44             self.storyid_reg = re.match(self.regex_str, self.storyname)
45             if self.storyid_reg:
46                 self.storyid=self.storyid_reg.group(1)#正则取出用例编号
47                 #print(self.storyid_reg.group(1)) 
48             self.testcase_num=self.xmind_num(self.story[i]['topics'][0])
49             for k in range(0,self.testcase_num):
50                 self.testcase=self.story[i]['topics'][0]['topics'][k]
51                 self.testcase_name =self.xmind_title(self.testcase)
52                 self.testcase_stepnum=self.xmind_num(self.testcase) #每个用例的步骤数量
53                 self.sheet1.write(k + i + z + j, 2, self.testcase_name)
54                 self.sheet1.write(k + i + z + j, 0, self.storyid)
55                 self.sheet1.write(k + i + z + j, 1, self.storyname)
56                 self.sheet1.write(k + i + z + j, 5, servicename)
57                 self.sheet1.write(k + i + z + j, 6, editionname)
58                 self.sheet1.write(k + i + z + j, 7, performer)
59                 for x  in range(0,self.testcase_stepnum):
60                     self.testcase_step=self.testcase['topics'][x]
61                     self.teststep_title=self.xmind_title(self.testcase_step) #用例步骤名称
62                     self.teststep_num=self.xmind_num(self.testcase_step) #用例步骤个数
63                     if self.teststep_num != 0:
64                         for y in range(0,self.teststep_num):
65                             self.test_results=self.testcase_step['topics'][y]
66                             self.test_result=self.xmind_title(self.test_results)#用例结果
67                             self.sheet1.write(k + i + z + j+y+1, 3, self.teststep_title)
68                             self.sheet1.write(k + i + z + j + y+1, 4, self.test_result)
69                         z = z + y+1
70                     else:
71                         self.test_result=' '
72                         self.sheet1.write(k + i + z + j+1  , 3, self.teststep_title)
73                         self.sheet1.write(k + i + z + j+1 , 4, self.test_result)
74                         z = z + 1
75             j=j+k
76         self.f.save(self.xls_name+'.xls') #xls名称取xmind主题名称
77 
78 if __name__ == '__main__':
79      xmind_file = "C:\\Users\\Administrator\\Desktop\\版本测试.xmind"  # xmind文件
80      servicename='aa'
81      editionname='bb'
82      performer='cc'
83      #xmind_to_xls().write_excel(xmind_file,servicename,editionname,performer)
84      xmind_to_xls().xmind_cat(xmind_file)