freemind生成的文件扩展名为.mm,实际就是一个标准的xml文档,我们用记事本打开.mm文件,样式如下:
因此我们可以利用python的xml库,来将这个xml文档层层解析,并写入Excel文件中。为了有一个可视化的界面,可以引入tkinter库来生成一个对话框,用来选择.mm文件和生成Excel的目录。【注意】python2和python3的tkinter库和引用方式有细微变化,暂时不兼容,本文是用python3编写。
选文件界面样式如下:
freemind样式如下:
生成的Excel文件样式如下:
全文代码如下(本人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))



