• 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(17)
    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):
    """生成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)
    try:
    if modnum != 0:
    for j in range(modnum):
    try:
    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) # 执行步骤有几个
    try:
    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) # 写入预期结果
    try:
    if 'priority-1' in self.xmind_makers(test_suit):
    self.worksheet.write(x, 5, 'P0', 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) # 适用阶段
    except Exception as msg:
    self.worksheet.write(x, 5, 'P2', style) # 优先级
    self.worksheet.write(x, 6, '功能用例', style) # 适用阶段
    # print(f'没有标记用例级别,请处理{msg}')
    except Exception as msg:
    # print(f"测试用例没有操作步骤及预期结果{msg}")
    pass
    except Exception as msg:
    print(f"没有测试用例{msg}")
    except Exception as msg:
    print(f"没有测试套件{msg}")

    self.save(self.xm["title"]) # 保存

    if __name__ == "__main__":
    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()
            print(f"地址:{path}")
            regvalue = '.*\.xmind$'
            xmind_reg = re.match(regvalue, path)
            if xmind_reg:
                # xmind转换成xls
                XmindToXlsx(path)
            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布局,按钮显示在第一行,第三列
    
            # 提交按钮
            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文件

     

  • 相关阅读:
    (整理)REHL6.5_Yum安装Reids
    (整理)REHL6.5_安装本地yum
    (转)MSSQLSERVER执行计划详解
    (转)SQLServer_十步优化SQL Server中的数据访问四
    (转)SQLServer_十步优化SQL Server中的数据访问五
    (转)SQLServer_十步优化SQL Server中的数据访问 三
    (转)SQLServer_十步优化SQL Server中的数据访问 二
    (转)SQLServer_十步优化SQL Server中的数据访问一
    (转)EF5+SQLserver2012迁移到EF6+mysql5.5.47
    (整理)MySQL_REHL6.5 MySQL5.5 中文支持问题
  • 原文地址:https://www.cnblogs.com/Teachertao/p/16298652.html
Copyright © 2020-2023  润新知