基于python实现xmind测试用例导出excel格式

1.下载xmind-SDK源码

1.1地址

https://github.com/xmindltd/xmind-sdk-python

1.2安装

执行安装:python3 setup.py instal

# @Time    : 2021/7/21 12:21
# @Author : cici
"""
导入xmindparser模块是为了解析xmind获得字典列表
"""
import xmindparser
#导入xlwt模块是为了创建excel并写入数据的
import xlwt
#定义一个类
class Xmind2Excel():
#定义一个配置方法
def config(self):
# xmindparser导出格式配置
xmindparser.config = {
'showTopicId': False, # 是否展示主题ID
'hideEmptyValue': True, # 是否隐藏空值
'showRelationship': True # 新增配置,是否展示节点关系
}
#定义一个解析xmind内容的方法
def xmind(self):
filePath = '/Users/july/Desktop/客户端职能划分.xmind'
# 解析成dict数据类型
# 获取列表中的第1个字典中的topic:内容即包括一级标题在内的xmind内容,content行参
content = xmindparser.xmind_to_dict(filePath)[0]['topic']
#将content属性返回给方法的调用处self
return content
#创建一个excel,并输入表头,然后对表头字体进行设置
def styles(self,bold,height):
# 初始化样式,就是将excel样式初始化一个对象,可以理解为对这个样式类实例化对象style
style = xlwt.XFStyle()
# 为样式创建字体,也是对字体类实例化对象front
font = xlwt.Font()
font.name = 'Times New Roman'
# 加粗
font.bold = bold
# 字体大小,20是基数不变,18是字体大小
font.height = 20 * height
# 将设置的字体,赋值给类对象
style.font = font
#调用合并单元格方法
style.alignment=self.alignment()
#将配置好的格式返回给调用处
return style
#创建背景色
def patterns(self,colors=23):
"""
设置单元格的背景颜色,该数字表示的颜色在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
#合并单元格方法
def alignment(self):
# 创建对齐格式对象
alignment = xlwt.Alignment()
# 左右的对其,水平居中 May be: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER,
# HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED,
# HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED
alignment.horz = xlwt.Alignment.HORZ_CENTER
# 上下对齐 May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED
alignment.vert = xlwt.Alignment.VERT_CENTER
return alignment
def buildExcel(self):
# 将styles方法中的格式赋值给新的对象,并将背景色方法赋值给给新的对象的背景色属性=style2.pattern
style2 = self.styles(True, 18)
style2.pattern = self.patterns()
style2.alignment=self.alignment()
# 创建一个excel
self.workexcel = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet对象就是excel中的第一个表,第二个参数是指单元格是否允许重设置,为了防止重复对一个单元格写入报错,设置允许true
self.worksheet = self.workexcel.add_sheet('test1', cell_overwrite_ok=True)
# 设置worksheet每一列的宽度15列,range是不包含15的
for m in range(15):
first_col = self.worksheet.col(m)
first_col.width = 256 * 20
# 表头
title = ['功能点', '前提条件', '执行步骤', '期望结果', '备注'] # 写成excel表格用例的要素
# 列表长度6
num = len(title)
# for循环遍历最大到5,从0开始不含6
for i in range(num):
# 往表格中填充表头
## 第一个参数代表行,第二个参数是列,第三个参数是内容,第四个参数是格式调用styles2格式
self.worksheet.write(0, i, title[i], style2)
def writeExcel(self):
# 调用类内方法时,如果调用的方法内参数写了self,那么调用方法时需要使用self.方法名()来调用
xm = self.xmind()
print(xm)
x = 1 # 初始化行数
m = 0 #初始化第一级步骤数
n = 0 #初始化第二级步骤数
z = 0 #初始化第三级步骤数
# 第一级topics
for a in range(len(xm["topics"])): # topics列表中只有一个{}
case1 = xm["topics"][a] # 获取{}元祖给case1,元祖中有一级标题及下一级4个分支模块
print(x)
print(case1["title"]) # 第一级title
# 第二级topics
if len(case1) >= 2:
for b in range(len(case1["topics"])): # 元祖中的四个模块
case2 = case1["topics"][b] # 将case1四个模块中的第一个模块的title和topics都给case2,case2中有2个功能点
print(x)
print(case2["title"]) # 第二级模块
#self.worksheet.write(x, 1, case2["title"], self.styles(False, 15))
x += 1
# 第三级topics
if len(case2) >= 2:
x -= 1
for c in range(len(case2["topics"])): # 第三级功能点
# 将case2中的第一个功能点给case3,case3中有3个步骤,第二遍case3中只有功能点2,不满足len(case3)>=2
case3 = case2["topics"][c]
print(x)
print(case3["title"]) # 第三层功能点
#self.worksheet.write(x, 2, case3["title"], self.styles(False, 15))
x += 1
# 第四级topics
if len(case3) >= 2:
x -= 1
#当for语句不满足后会直接去执行if的else语句
for d in range(len(case3["topics"])):
case4 = case3["topics"][d] # 将case3中的第一个步骤给case4,case4中只有1个title
print(x)
print(case4["title"]) # 获取第4层内容
self.worksheet.write(x, 3, case4["title"], self.styles(False, 15))
x += 1
# 第五级topics
if len(case4) >= 2:
x -= 1
for e in range(len(case4["topics"])):
case5 = case4["topics"][e]
print(x)
print(case5["title"])
self.worksheet.write(x, 4, case5["title"], self.styles(False, 15))
x += 1
if len(case5) >= 2:
x -= 1
for h in range(len(case5["topics"])):
case6 = case5["topics"][h]
print(x)
print(case6["title"])
self.worksheet.write(x, 5, case6["title"], self.styles(False, 15))
x+=1
if len(case6) >= 2:
x -= 1
for j in range(len(case6["topics"])):
case7 = case6["topics"][j]
print(x)
print(case7["title"])
self.worksheet.write(x, 6, case7["title"],self.styles(False, 15))
x += 1
if len(case7) >= 2:
x -= 1
for k in range(len(case7["topics"])):
case8 = case7["topics"][k]
print(x)
print(case8["title"])
self.worksheet.write(x, 7, case8["title"],self.styles(False, 15))
x += 1
if len(case8) >= 2:
x -= 1
for k in range(len(case8["topics"])):
case9 = case8["topics"][k]
print(x)
print(case9["title"])
self.worksheet.write(x, 8, case9["title"],self.styles(False, 15))
x += 1
if len(case9) >= 2:
x -= 1
for k in range(len(case9["topics"])):
case10 = case9["topics"][k]
print(x)
print(case10["title"])
self.worksheet.write(x, 9,case10["title"],self.styles(False, 15))
self.worksheet.write_merge(x - 1 - (x - 1 - z) + 1, x - 1, 2, 2, case3["title"],self.styles(False, 15))
z = x - 1
self.worksheet.write_merge(x - 1 - (x - 1 - n) + 1, x - 1, 1, 1, case2["title"],self.styles(False, 15))
n = x - 1
#如果步骤没有进入下一层,那么对于第三列的z就少记录一行,加上x在if前比实际多1,所以需要在这里执行一次z=x-1,就是上一个用例的行数
z = x - 1
# 调用类内其他方法的属性,需要在方法中创建self.属性名,然后在需要调用的方法内部采用self.属性名调用
#合并单元格,X-1是当前一级标题的最后一个case的行数,因为最后一个case不满足条件后x是+1的,为了进入下一个模块,所以需要-1算当前模块所在行数
#write_merge是从第几行~第几行,当前模块所在行数-上个模块所在行数就是当前模块的步骤数,当前模块所在行数-步骤数+1就是当前模块开始行
#之所以选择case2的for判断语句是因为,如果b循环结束,那么这个模块也就结束了,正适合合并单元格
self.worksheet.write_merge(x-1-(x-1-m)+1, x-1, 0, 0, case1["title"], self.styles(False, 15))
#将上一个模块最后的行数赋值给m
m=x-1
# 保存workexcel文件名为testcase2,存在项目文件夹内
self.workexcel.save('testcase2.xls')
#定义一个类对象,来调用类中的方法或者属性
xmindexcel=Xmind2Excel()
#调用方法体中的配置
xmindexcel.config()
xmindexcel.buildExcel()
xmindexcel.writeExcel()
参考文档:https://www.jb51.net/article/197244.htm
原文地址:https://www.cnblogs.com/T-CYP/p/15022297.html