背景
今日遇到一个需求,需要将xmind导出的文件转为excel,因为免费版无该功能。因为python语言的特性,故决定使用python来做这个工作。
前置条件
- 安装xmindparser,openpyxl这两个python库
- 安装python
#安装依赖
pip install xmindparser openpyxl
解决方案
from typing import List, Any
from openpyxl import Workbook
from xmindparser import xmind_to_dict
import datetime
def resolve_path(dict_, lists, title):
"""
通过递归取出每个主分支下的所有小分支并将其作为一个列表
:param dict_:
:param lists:
:param title:
:return:
"""
# 去除title首尾空格
title = title.strip()
# 若title为空,则直接取value
if len(title) == 0:
concat_title = dict_["title"].strip()
else:
concat_title = title + "\t" + dict_["title"].strip()
# 递归结束条件不再有topics
if not dict_.__contains__("topics"):
lists.append(concat_title)
else:
for d in dict_["topics"]:
resolve_path(d, lists, concat_title)
def xmind_to_excel(list_, excel_path):
wb = Workbook()
sheet = wb.active
# 第一行固定的表头标题
row_header = ["序号", "模块", "功能点", ""]
for i in range(0, len(row_header)):
sheet.cell(1, i+1, row_header[i])
# 增量索引
index = 0
for h in range(0, len(list_)):
lists: List[Any] = []
resolve_path(list_[h], lists, "")
# print(lists)
# print('\n'.join(lists)) # 主分支下的小分支
for j in range(0, len(lists)):
# 将主分支下的小分支构成列表
lists[j] = lists[j].split('\t')
# print(lists[j])
for n in range(0, len(lists[j])):
# 生成第一列的序号
sheet.cell(j + index + 1+1, 1, j + index + 1)
sheet.cell(j + index + 1+1, n + 1+1, lists[j][n])
# 自定义内容,比如:测试点/用例标题、预期结果、实际结果、操作步骤、优先级……
# 这里为了更加灵活,除序号、模块、功能点的标题固定,其余以【自定义+序号】命名,如:自定义1,需生成Excel表格后手动修改
if n >= 2:
sheet.cell(1, n + 1+1, "自定义" + str(n - 1))
# 遍历完lists并给增量索引赋值,跳出for j循环,开始for h循环
if j == len(lists) - 1:
index += len(lists)
wb.save(excel_path)
def run(xmind_path):
# 将XMind转化成字典
xmind_dict = xmind_to_dict(xmind_path)
# print("将XMind中所有内容提取出来并转换成列表:", xmind_dict)
# Excel文件与XMind文件保存在同一目录下
excel_name = xmind_path.split(
'\\')[-1].split(".")[0] + '-' + datetime.datetime.now().strftime("%Y%m%d%H%M%S") + '.xlsx'
excel_path = "\\".join(xmind_path.split('\\')[:-1]) + "\\" + excel_name
print(excel_path)
# print("通过切片得到所有分支的内容:", xmind_dict[0]['topic']['topics'])
xmind_to_excel(xmind_dict[0]['topic']['topics'], excel_path)
if __name__ == '__main__':
xmind_path_ = r"file_name"
run(xmind_path_)
通过命令行运行该文件,即可获得转换后的excel
参考资料
【原作需要将excel_name变量的最后.xlsx改为.xls,否则会遇到文件损坏无法打开excel】