freemind生成的文件扩展名为.mm,实际就是一个标准的xml文档,我们用记事本打开.mm文件,样式如下:
因此我们可以利用python的xml库,来将这个xml文档层层解析,并写入Excel文件中。为了有一个可视化的界面,可以引入tkinter库来生成一个对话框,用来选择.mm文件和生成Excel的目录。
【注意】
1)python2和python3的tkinter库和引用方式有细微变化,暂时不兼容,本文是用python3编写
2)引入了xlwt库,如果执行报错可以自己pip安装xlwt
选文件界面样式如下:
freemind样式如下:
实现方式1:生成的Excel文件样式如下:
实现方式1的代码如下(本人python刚入门,代码有不合理之处可以共同讨论,请见谅):
# 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))