Python 使用Xmind转换为excel 小工具
1. 前言
测试经常使用xmind进行需求分析,再根据需求分析转换为excel,这样的效率比较低,我们可以直接使用xmind转换为excel,省去重复的测试工作,提升效率
2. xmind 导入excel 的方式需安装博主提供的格式来,源码只支持当期的格式,如下:
3. 实现源码--转换为excel如下:
安装:pip3 install xmindparser ,xmind转换dict,提取节点
# --*-- conding:utf-8 --*-- # @Time : 2022-05-22 14:10# @File : runExcel.py # @Software : PyCharm from xmindparser import xmind_to_dict import xlwt class XlwtSeting(object): @staticmethod # 静态方法装饰器,使用此装饰器装饰后,可以直接使用类名.方法名调用(XlwtSeting.styles()),并且不需要self参数 def template_one(worksheet): dicts = {"horz": "CENTER", "vert": "CENTER"} sizes = [10, 11, 30, 60, 50, 11, 11] se = XlwtSeting() style = se.styles() style.alignment = se.alignments(**dicts) style.font = se.fonts(bold=True) style.borders = se.borders() style.pattern = se.patterns(7) se.heights(worksheet, 0) for i in range(len(sizes)): se.widths(worksheet, i, size=sizes[i]) return style @staticmethod def template_two(): dicts2 = {"vert": "CENTER"} se = XlwtSeting() style = se.styles() style.borders = se.borders() style.alignment = se.alignments(**dicts2) return style @staticmethod def styles(): """设置单元格的样式的基础方法""" style = xlwt.XFStyle() return style @staticmethod def borders(status=1): """设置单元格的边框, 细实线:1,小粗实线:2,细虚线:3,中细虚线:4,大粗实线:5,双线:6,细点虚线:7大粗虚线:8,细点划线:9,粗点划线:10,细双点划线:11,粗双点划线:12,斜点划线:13""" border = xlwt.Borders() border.left = status border.right = status border.top = status border.bottom = status return border @staticmethod def heights(worksheet, line, size=4): """设置单元格的高度""" worksheet.row(line).height_mismatch = True worksheet.row(line).height = size * 256 @staticmethod def widths(worksheet, line, size=11): """设置单元格的宽度""" worksheet.col(line).width = size * 256 @staticmethod def alignments(wrap=1, **kwargs): """设置单元格的对齐方式, :接收一个对齐参数的字典{"horz": "CENTER", "vert": "CENTER"}horz(水平),vert(垂直) :horz中的direction常用的有:CENTER(居中),DISTRIBUTED(两端),GENERAL,CENTER_ACROSS_SEL(分散),RIGHT(右边),LEFT(左边) :vert中的direction常用的有:CENTER(居中),DISTRIBUTED(两端),BOTTOM(下方),TOP(上方)""" alignment = xlwt.Alignment() if "horz" in kwargs.keys(): alignment.horz = eval(f"xlwt.Alignment.HORZ_{kwargs['horz'].upper()}") if "vert" in kwargs.keys(): alignment.vert = eval(f"xlwt.Alignment.VERT_{kwargs['vert'].upper()}") alignment.wrap = wrap # 设置自动换行 return alignment @staticmethod def fonts(name='宋体', bold=False, underline=False, italic=False, colour='black', height=11): """设置单元格中字体的样式, 默认字体为宋体,不加粗,没有下划线,不是斜体,黑色字体""" font = xlwt.Font() # 字体 font.name = name # 加粗 font.bold = bold # 下划线 font.underline = underline # 斜体 font.italic = italic # 颜色 font.colour_index = xlwt.Style.colour_map[colour] # 大小 font.height = 20 * height return font @staticmethod def patterns(colors=1): """设置单元格的背景颜色,该数字表示的颜色在xlwt库的其他方法中也适用,默认颜色为白色 0 = Black, 1 = White,2 = Red, 3 = Green, 4 = Blue,5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green,18 = Dark Blue, 19 = Dark Yellow ,almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray,23 = Dark Gray, the list goes on...""" pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = colors return pattern class XmindToXlsx(XlwtSeting): def __init__(self, name): """调用类时,读取xmind文件,并生成excel表格""" try: self.xm = xmind_to_dict(name)[0]['topic'] except Exception as e: print(f"打开xmind文件失败:{e}") self.workbook = xlwt.Workbook(encoding='utf-8') # 创建workbook对象 self.worksheet = self.workbook.add_sheet(self.xm["title"], cell_overwrite_ok=True) # 创建工作表 def save(self, name): """保存表格""" self.workbook.save(name + ".xlsx") @staticmethod def xmind_num(value): """获取xmind标题个数""" try: return len(value["topics"]) except KeyError: return 0 @staticmethod def xmind_title(value): """获取xmind标题内容""" return value["title"] @staticmethod def xmind_makers(value): """获取xmind标题内容""" return value["makers"][0] def write_excel(self, result='', performer='', editionname=''): """生成excel文件的方法""" row0 = ["系统模块", '需求名称', '用例名称','测试步骤', '预期结果', '优先级','适用阶段'] style2 = self.template_one(self.worksheet) for i in range(len(row0)): self.worksheet.write(0, i, row0[i], style2) style = self.template_two() x = 0 # 写入数据的当前行数 z = 0 # 用例的编号 for i in range(self.xmind_num(self.xm)): test_module = self.xm["topics"][i] modnum = self.xmind_num(test_module) if modnum != 0: for j in range(modnum): test_suit = test_module["topics"][j] suit_num = self.xmind_num(test_suit) if suit_num != 0: for k in range(suit_num): test_case = test_suit["topics"][k] z += 1 c1 = self.xmind_num(test_case) # 执行步骤有几个 if c1 != 0: for n in range(c1): x += 1 test_step = test_case["title"] test_except = test_case["topics"][0] self.heights(self.worksheet, x, size=2) sys = self.xmind_title(self.xm) # 系统模块 mod = self.xmind_title(test_module) # 测试需求名称 case = self.xmind_title(test_suit) # 测试用例名称 step = test_step # 执行步骤 exce = self.xmind_title(test_except) # 预期结果 self.worksheet.write(x, 0, sys, style) # 系统模块 self.worksheet.write(x, 1, mod, style) # 测试需求名称 self.worksheet.write(x, 2, case, style) # 测试用例名称 self.worksheet.write(x, 3, step, style) # 写入执行步骤 self.worksheet.write(x, 4, exce, style) # 写入预期结果 if 'priority-1' in self.xmind_makers(test_suit): self.worksheet.write(x, 5, 'P1', style) # 优先级 self.worksheet.write(x, 6, '冒烟用例', style) # 适用阶段 elif 'priority-2' in self.xmind_makers(test_suit): self.worksheet.write(x, 5, 'P2', style) # 优先级 self.worksheet.write(x, 6, '功能用例', style) # 适用阶段 else: self.worksheet.write(x, 5, 'P3', style) # 优先级 self.worksheet.write(x, 6, '功能用例', style) # 适用阶段 # mod = self.xmind_title(test_module) # 测试需求名称 # case = self.xmind_title(test_case) # 测试用例名称 # self.worksheet.write_merge(x - c1 + 1, x, 0, 0, z, style) # 写入testcaseid # self.worksheet.write_merge(x - c1 + 1, x, 1, 1, mod, style) # 写入测试需求名称 # self.worksheet.write_merge(x - c1 + 1, x, 2, 2, case, style) # 写入测试用例名称 # self.worksheet.write_merge(x - c1 + 1, x, 7, 7, editionname, style) # 写入版本名称 else: print("测试用例没有操作步骤及预期结果") else: print("没有测试用例") else: print("没有测试套件") self.save(self.xm["title"]) # 保存 if __name__ == "__main__": # name = 'E:/SoftWareTest/Project/TestCase/XmindToExcel/xmindTol.xmind' name = 'xmindTol.xmind' xx = XmindToXlsx(name) xx.write_excel()
4. 执行如上的源码后,自动在当前根目录下生成以测试系统+xlsx 的文件名
5. 生成GUI可视化小工具,需要使用tkinter,把之前封装的方法需要的参数,关联起来进行打包
import tkinter import re from tkinter.filedialog import askopenfilename from tkinter import messagebox from Project.TestCase.XmindToExcel.runExcel import XmindToXlsx # 导入上步的源码 class MainUI(object): def __init__(self, title="fezs", geometrysize="350x250", geometry="+800+350"): self.top = tkinter.Tk() # 生成主窗口 self.top.title(title) # 设置窗口的标题 self.top.geometry(geometrysize) # 设置窗口的大小 self.top.geometry(geometry) # 设置窗口出现的位置 self.top.resizable(0, 0) # 将窗口大小设置为不可变 self.path = tkinter.StringVar() # 生成一个StringVar 对象,来保存下面输入框中的内容 self.person = tkinter.StringVar() self.version = tkinter.StringVar() # 调用自己写的create_widgets()方法 self.create_widgets() def get_value(self): """获取文本框中数据,并调用XmindToXsl类""" path = self.path.get() # per = self.person.get() # ver = self.version.get() # print(f"地址:{path},测试人员:{per},测试版本:{ver}") print(f"地址:{path}") regvalue = '.*\.xmind$' xmind_reg = re.match(regvalue, path) if xmind_reg: # xmind转换成xls XmindToXlsx(path) # xmind_to_xls.write_excel(performer=per, editionname=ver) else: messagebox.showinfo(title='提示', message='请选择正确的xmind文件,谢谢!') def select_path(self): """选择要转换成excel的xmind地址""" path_ = askopenfilename() self.path.set(path_) def create_widgets(self): """创建窗口中的各种元素""" # 文件的路径 first_label = tkinter.Label(self.top, text='目标路径:') # 生成一个标签 first_label.grid(row=0, column=0) # 使用grid布局,标签显示在第一行,第一列 first_entry = tkinter.Entry(self.top, textvariable=self.path) # 生成一个文本框,内容保存在上面变量中 first_entry.grid(row=0, column=1) # 使用grid布局,文本框显示在第一行,第二列 way_button = tkinter.Button(self.top, text="路径选择", command=self.select_path) way_button.grid(row=0, column=2) # 使用grid布局,按钮显示在第一行,第三列 # 测试人员 # second_label = tkinter.Label(self.top, text="执行人员:") # second_label.grid(row=1, column=0) # second_entry = tkinter.Entry(self.top, textvariable=self.person) # second_entry.grid(row=1, column=1) # 版本 # third_label = tkinter.Label(self.top, text="测试版本:") # third_label.grid(row=2, column=0) # third_entry = tkinter.Entry(self.top, textvariable=self.version) # third_entry.grid(row=2, column=1) # 提交按钮 f_btn = tkinter.Frame(self.top, bg='red') # 设置一个frame框架,并设置背景颜色为红色 f_btn.place(x=0, y=205, width=350, height=45) # 设置框架的大小,及在top窗口显示位置 submit_button = tkinter.Button(f_btn, text="提交", command=self.get_value, width=49, height=2, bg="#00FFFF") # 设置按钮的文字,调用方法,大小,颜色,显示框架 submit_button.grid(row=0, column=2) # 使用grid布局,按钮显示在第一行,第一列 # 进入消息循环(必需组件) self.top.mainloop() if __name__ == "__main__": mu = MainUI(title="fezs")
6. 打包 -- 在线安装 pip install pyinstaller ,使用pyinstaller 打包文件
pyinstaller -F mainUI.py -p runExcel.py
-F 后是main文件,-p 后是自己编写的依赖py文件,多个文件使用;分隔。
执行完小工具后,在当前dist目录下生成excel文件