背景
由于習慣使用xmind梳理test point,但有些場景描述較長且不是每個人都安裝xmind,為了方便于是寫了個xmind轉Excel格式的Python腳本。
效果
xmind層級關系
xmind格式test point.png
轉為Excel樣式
summary.png
Test point1.png
Test point2.png
腳本代碼及解釋
- 主要使用到xmindparser, json, xlwt這三個依賴包,思路是解釋xmind文件得到一個json, 然后解釋json對象,并寫入到Excel文件。
- 實際使用中可根據需要調整樣式或者需要的列,獻上源碼
# coding=utf-8
import time
from xmindparser import xmind_to_dict
import json
import xlwt
def writerows(worksheet):
sizes = [15, 20, 40, 50, 70, 70, 8, 8, 8, 10, 20]
columns = ["No.", 'Test title', 'Description', 'Prerequisite', 'Test step', 'Expect result',
'Level', 'Type', 'Result', 'Tracker', 'Comment'] # 寫成excel表格用例的要素
for col in range(len(columns)):
worksheet.write(1, col, columns[col], title_styles())
widths(worksheet, col, size=sizes[col])
heights(worksheet, 1, 2)
def title_styles():
"""設置單元格標題樣式的基礎方法"""
style = xlwt.XFStyle()
style.pattern = patterns(46)
style.font = fonts('Times New Roman', True)
style.borders = borders()
dicts = {"horz": "CENTER", "vert": "CENTER"}
style.alignment = alignments(**dicts)
style.borders = borders()
return style
def normalstyles():
"""設置單元格標題樣式的基礎方法"""
style = xlwt.XFStyle()
style.font = fonts('Arial', False, False, False, "black", 10)
style.borders = borders()
dicts = {"horz": "LEFT", "vert": "CENTER"}
style.alignment = alignments(**dicts)
style.borders = borders()
return style
def borders(status=1):
"""設置單元格的邊框
細實線:1,小粗實線:2,細虛線:3,中細虛線:4,大粗實線:5,雙線:6,細點虛線:7大粗虛線:8,細點劃線:9,粗點劃線:10,細雙點劃線:11,粗雙點劃線:12,斜點劃線:13"""
border = xlwt.Borders()
border.left = status
border.right = status
border.top = status
border.bottom = status
return border
def heights(worksheet, line, size=4):
"""設置單元格的高度"""
worksheet.row(line).height_mismatch = True
worksheet.row(line).height = size * 256
def widths(worksheet, line, size=11):
"""設置單元格的寬度"""
worksheet.col(line).width = size * 256
def alignments(**kwargs):
"""設置單元格的對齊方式
status有兩種:horz(水平),vert(垂直)
horz中的direction常用的有:CENTER(居中),DISTRIBUTED(兩端),GENERAL,CENTER_ACROSS_SEL(分散),RIGHT(右邊),LEFT(左邊)
vert中的direction常用的有:CENTER(居中),DISTRIBUTED(兩端),BOTTOM(下方),TOP(上方)"""
alignment = xlwt.Alignment()
if "horz" in kwargs.keys():
alignment.horz = eval(f"xlwt.Alignment.HORZ_{kwargs['horz'].upper()}")
if "vert" in kwargs.keys():
alignment.vert = eval(f"xlwt.Alignment.VERT_{kwargs['vert'].upper()}")
alignment.wrap = 1 # 設置自動換行
return alignment
def fonts(name='Times New Roman', bold=False, underline=False, italic=False, colour='black', height=11):
"""設置單元格中字體的樣式
默認字體為宋體,不加粗,沒有下劃線,不是斜體,黑色字體"""
font = xlwt.Font()
# 字體
font.name = name
# 加粗
font.bold = bold
# 下劃線
font.underline = underline
# 斜體
font.italic = italic
# 顏色
font.colour_index = xlwt.Style.colour_map[colour]
# 大小
font.height = 20 * height
return font
def patterns(colors=19):
"""設置單元格的背景顏色,該數字表示的顏色在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 main(xmind_file):
xm = xmind_to_dict(xmind_file)[0]['topic']
# indent is format json, ensure_ascii not show Chinese, not show ASCII code
print(json.dumps(xm, indent=2, ensure_ascii=False))
workbook = xlwt.Workbook(encoding='utf-8') # 創建workbook對象
# Add Summary
summary_sheet = workbook.add_sheet("Summary")
widths(summary_sheet, 0, 30)
summary_sheet.write(0, 0, "Test Point List", title_styles())
for i in range(len(xm["topics"])):
test_suit = xm["topics"][i]
summary_sheet.write(i + 1, 0, str(i + 1).__add__(". ").__add__(test_suit["title"]), normalstyles())
worksheet = workbook.add_sheet(test_suit["title"], cell_overwrite_ok=True) # 創建工作表,并設置可以重寫單元格內容
worksheet.write(0, 0, "Comment", title_styles())
worksheet.write_merge(0, 0, 1, 5, test_suit["note"])
heights(worksheet, 0, 3)
writerows(worksheet)
x = 2 # 寫入數據的當前行數
for j in range(len(test_suit["topics"])):
test_point_title = test_suit["topics"][j]
for k in range(len(test_point_title["topics"])):
test_prerequisite = test_point_title["topics"][k]
for n in range(len(test_prerequisite["topics"])):
test_step = test_prerequisite["topics"][n]
for m in range(len(test_step["topics"])):
test_except = test_step["topics"][m]
for q in range(len(test_except["topics"])):
test_type_and_tracker = test_except["topics"][q]
worksheet.write(x, 0, x - 1, normalstyles()) # No.
worksheet.write(x, 1, test_point_title["title"], normalstyles()) # 執行title
worksheet.write(x, 2, test_point_title["note"], normalstyles()) # 執行prerequisite
worksheet.write(x, 3, test_prerequisite["title"], normalstyles()) # 執行prerequisite
worksheet.write(x, 4, test_step["title"], normalstyles()) # 執行步驟
worksheet.write(x, 5, test_except["title"], normalstyles()) # 預期結果
level = "High"
if test_point_title["makers"][0] == "priority-2":
level = "Medium"
if test_point_title["makers"][0] == "priority-3":
level = "Low"
worksheet.write(x, 6, level, normalstyles()) # Level
# testtype = "UT"
# if test_point_title["makers"][1] == "tag-orange":
# level = "CT"
# if test_point_title["makers"][1] == "tag-dark-blue":
# level = "FT"
# if test_point_title["makers"][1] == "tag-green":
# level = "MT"
# testtype = "UT"
# if test_type_and_tracker["makers"][1] == "tag-orange":
# # level = "CT"
# if test_point_title["makers"][1] == "tag-dark-blue":
# level = "FT"
# if test_point_title["makers"][1] == "tag-green":
# level = "MT"
optype = test_type_and_tracker["title"].split(":", 1)[0]
worksheet.write(x, 7, optype, normalstyles()) # Type
worksheet.write(x, 8, "", normalstyles()) # Result
worksheet.write(x, 9, "", normalstyles()) # Tracker
worksheet.write(x, 10, "", normalstyles()) # Comment
x += 1
# time.sleep(1)
print(x)
# print(test_point_title)
workbook.save(xm["title"] + ".xls") # xls名稱取xmind主題名稱
if __name__ == "__main__":
main("../testPointFile/TestPointSample.xmind")