利用python将freemind文件转为Excel

freemind生成的文件扩展名为.mm,实际就是一个标准的xml文档,我们用记事本打开.mm文件,样式如下:

   因此我们可以利用python的xml库,来将这个xml文档层层解析,并写入Excel文件中。为了有一个可视化的界面,可以引入tkinter库来生成一个对话框,用来选择.mm文件和生成Excel的目录。

【注意】

1)python2和python3的tkinter库和引用方式有细微变化,暂时不兼容,本文是用python3编写

2)引入了xlwt库,如果执行报错可以自己pip安装xlwt

    选文件界面样式如下:

   freemind样式如下:

实现方式1:生成的Excel文件样式如下:

实现方式1的代码如下(代码有不合理之处可以共同讨论):

# coding : utf-8
import tkinter
import tkinter.filedialog
import os
import xml.etree.ElementTree as ET
import xlwt


# 选freemind文件
def select_file():
    global file_path
    file_path = tkinter.filedialog.askopenfilename(title='选择一个freemind文件', filetypes=[('freemind文件', '.mm')])
    return file_path


# 选Excel生成目录
def select_folder():
    global folder_path
    folder_path = tkinter.filedialog.askdirectory(title='选择一个文件夹')
    return folder_path


# 生成窗口
def create_frame():
    win = tkinter.Tk()
    win.geometry('350x130')
    win.title("选择文件目录")
    file = tkinter.Button(win, text="选择freemind文件", height=2, width=20, fg="blue", bg="gray", command=select_file)
    file.pack()
    folder = tkinter.Button(win, text="选择生成的Excel目录", height=2, width=20, fg="blue", bg="gray", command=select_folder)
    folder.pack()
    excel = tkinter.Button(win, text="生成Excel文件", height=1, width=12, bg="gray", command=win.quit)
    excel.pack()
    win.mainloop()


# 获取xml节点等级
def get_xml_level(item, func, level=0):
    global g_row
    func(item, g_row, level)

    for child in list(item):
        name = child.get('TEXT')

        get_xml_level(child, func, level + 1)
        if child.find('node') is None and name is not None:
            g_row = g_row + 1


# 写入Excel文件
def write_excel(item, row, level):
    name = item.get('TEXT')
    if name is not None:
        ws.write(row, level, name)


if __name__ == '__main__':
    g_row = 0
    file_path = ''
    folder_path = ''
    file_name = 'freemind2excel.xlsx'
    create_frame()
    print('选择的freemind文件为:' + file_path)
    tree = ET.ElementTree(file=file_path)
    root = tree.getroot()
    first_node = root.find('node')
    wb = xlwt.Workbook()  # 创建工作簿
    ws = wb.add_sheet('freemind2excel')  # 指定工作簿名称
    get_xml_level(first_node, write_excel)
    wb.save(folder_path + '/' + file_name)
    if not os.path.exists(folder_path + '/' + file_name):
        print('Excel生成失败')
    else:
        print('Excel生成成功,路径为:' + folder_path + '/' + file_name)
        print('测试用例条数为:' + str(g_row))

实现方式2:生成的Excel文件样式如下:

实现方式2的代码如下(代码有不合理之处可以共同讨论):

# coding : utf-8
import tkinter
import tkinter.filedialog
import os
import xml.etree.ElementTree as ET
import xlwt


# 设置从第1行开始插入excel,因为第0行是标题
row_num = 1
# 设置用例名称所在列
casename_col_num = 1
# 设置创建人所在列,creator_name为创建人姓名,需要按需修改。
creator_col_num = 2
creator_name = 'XXX'
# 设置用例类型所在列
casetype_col_num = 3
testcase_type = '功能测试'
# 设置用例状态所在列
status_col_num = 4
testcase_status = '正常'


# 选freemind文件
def select_file():
    global file_path
    file_path = tkinter.filedialog.askopenfilename(title='选择一个freemind文件', filetypes=[('freemind文件', '.mm')])
    return file_path


# 选Excel生成目录
def select_folder():
    global folder_path
    folder_path = tkinter.filedialog.askdirectory(title='选择一个文件夹')
    return folder_path


# 生成窗口
def create_frame():
    win = tkinter.Tk()
    win.geometry('350x130')
    win.title("选择freemind文件目录")
    file = tkinter.Button(win, text="选择freemind文件", height=2, width=20, fg="blue", bg="gray", command=select_file)
    file.pack()
    folder = tkinter.Button(win, text="选择生成的Excel目录", height=2, width=20, fg="blue", bg="gray", command=select_folder)
    folder.pack()
    excel = tkinter.Button(win, text="生成Excel文件", height=1, width=12, bg="gray", command=win.quit)
    excel.pack()
    win.mainloop()


# 设置excel标题
def set_excel_header():
    col = 0
    header = ['用例目录', '用例名称', '创建人', '用例类型', '用例状态', '用例等级', '前置条件', '用例步骤',
              '预期结果', '执行终端', '需求ID', '执行阶段', '需要接口自动化', '需要UI自动化', '自动化覆盖']
    for name in header:
        write_excel(name, 0, col)
        col += 1


# 生成用例标题的模块名,格式为模块1__模块2__模块3__
def set_testcase_module(element, testcase_title):
    global g_row
    testcase_title = testcase_title + '__' + element.get('TEXT')
    for child in element:
        set_case(child, testcase_title)
        name = child.get('TEXT')
        if child.find('node') is None and name is not None:
            title_length = len(first_node.get('TEXT'))  # 计算根节点长度,用例标题的模块不必包含根节点
            write_excel(testcase_title[(4 + title_length):] + '__' + name, g_row, casename_col_num)  # 写入用例标题
            write_excel(creator_name, g_row, creator_col_num)  # 写入创建人
            write_excel(testcase_type, g_row, casetype_col_num)  # 写入用例类型
            write_excel(testcase_status, g_row, status_col_num)  # 写入用例状态
            g_row += 1


# 组成用例
def set_case(element, name):
    global g_row
    if element is not None:
        set_testcase_module(element, name)


# 写入Excel文件
def write_excel(name, row, col):
    ws.write(row, col, name)


if __name__ == '__main__':
    g_row = 1
    file_path = ''
    folder_path = ''
    file_name = 'freemind2excel_new.xlsx'
    create_frame()
    print('选择的freemind文件为:' + file_path)
    tree = ET.ElementTree(file=file_path)
    root = tree.getroot()
    first_node = root.find('node')
    wb = xlwt.Workbook()  # 创建工作簿
    ws = wb.add_sheet('freemind2excel')  # 指定工作簿名称
    set_excel_header()  # 写表头
    text_content = ''
    set_testcase_module(first_node, text_content)
    wb.save(folder_path + '/' + file_name)
    if not os.path.exists(folder_path + '/' + file_name):
        print('Excel生成失败')
    else:
        print('Excel生成成功,路径为:' + folder_path + '/' + file_name)
        print('测试用例条数为:' + str(g_row - 1))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值