GUI模式读取XMind并写入Excel

GUI模式读取XMind并写入Excel

模板示例样式(可根据自己实际情况进行更改,源码在底部)

XMind模板

一、读取XMind数据

1、安装xmindparser库读取XMind数据
pip install xmindparser
2、使用xmindparser库,读取XMind数据
  • xmind_to_dict:读取的数据为列表嵌套字典
  • xmind_to_file:读取的数据存放在文件中
  • xmind_to_json:读取的数据为json格式
  • xmind_to_xml:读取的数据为xml格式

我使用的是第一种xmind_to_dict

1)导包
from xmindparser import xmind_to_dict
2)使用
XMindName = "./data/case.xmind"
xmind_data = xmind_to_dict(XMindName)
3)获取的数据
[{
	'title': '画布 1',
	'topic': {
		'title': '测试用例',
		'topics': [{
			'title': '用例模块1',
			'topics': [{
				'title': '用例1',
				'topics': [{
					'title': '步骤',
					'topics': [{
						'title': '预期结果'
					}]
				}]
			}, {
				'title': '用例2',
				'topics': [{
					'title': '步骤',
					'topics': [{
						'title': '预期结果'
					}]
				}]
			}, {
				'title': '用例3',
				'topics': [{
					'title': '步骤',
					'topics': [{
						'title': '需要的参数',
						'topics': [{
							'title': '预期结果'
						}]
					}, {
						'title': '第二种参数',
						'topics': [{
							'title': '预期结果'
						}]
					}]
				}]
			}]
		}, {
			'title': '用例模块2',
			'topics': [{
				'title': '用例1'
			}, {
				'title': '用例2'
			}, {
				'title': '用例3'
			}]
		}, {
			'title': '用例模块3',
			'topics': [{
				'title': '用例1',
				'topics': [{
					'title': '预期结果'
				}]
			}, {
				'title': '用例2',
				'topics': [{
					'title': '预期结果'
				}]
			}, {
				'title': '用例3',
				'topics': [{
					'title': '预期结果'
				}]
			}]
		}]
	},
	'structure': 'org.xmind.ui.map.unbalanced'
}]

二、处理XMind数据

1、创建一个处理XMind数据工具类
class XMindData:
    """
    XMind数据处理
    """

    def __init__(self):
        """
        定义两个list数组
        """
        # 存放每一条用例
        self.result: list = []
        # 存放所有的用例list
        self.lists_data: list = []
2、创建一个私有方法(递归)
    def __data_processing(self, data):
        """
        私有方法,采用递归处理数据
        :param data:
        :return:
        """
        self.result.append(data["title"])
        # 通过json path判断是该data是否包含topics节点(包含返回数据,不包含则返回False)
        result = jsonpath.jsonpath(data, "$.topics")

        # 判断result类型,不是bool类型的时候进行递归
        if type(result) != bool:
            for xm in result:
                for m in xm:
                    self.__data_processing(m)
            # 此处需要在把最后一个节点删除掉
            self.result = self.result[:-1]
        else:
            self.lists_data.append(self.result)
            self.result = self.result[:-1]
3、创建一个循环调用递归函数,读取数据
    def get_lists_data(self, data) -> list:
        """
        循环调用递归函数,读取数据,
        :param data: 传的数据参数是第一个画布的头节点的所有节点信: data = allData[0]["topic"]["topics"]
        :return: list嵌套list,每一个嵌套的list就是一条测试用例
        """
        for xm in data:
            self.__data_processing(xm)
            # 清空模块一的遗留数据,不给后面造成影响
            self.result = []
        return self.lists_data
4、测试读取
if __name__ == '__main__':
    list1 = XMindData.read_XMind_to_list("../data/case.xmind")
    xm = XMindData()
    print(xm.get_lists_data(list1[0]["topic"]["topics"]))
5、读取结果
[
	['用例模块1', '用例1', '步骤', '预期结果'],
	['用例模块1', '用例2', '步骤', '预期结果'], 
	['用例模块1', '用例3', '步骤', '需要的参数', '预期结果'], 
	['用例模块1', '用例3', '步骤', '第二种参数', '预期结果'], 
	['用例模块2', '用例1'], 
	['用例模块2', '用例2'], 
	['用例模块2', '用例3'], 
	['用例模块3', '用例1', '预期结果'], 
	['用例模块3', '用例2', '预期结果'], 
	['用例模块3', '用例3', '预期结果']
]

三、创建写入Excel的工具类

代码如下(注释很清晰):

import os

import openpyxl


class ExcelData:

    def __init__(self, file_name=None, sheetName="Sheet"):
        """
        初始化方法
        :param file_name:
        :param sheetName:
        """
        self.fileName = file_name
        self.sheetName = sheetName

    def creat_excel_and_set_title(self, titles: list = None):
        """
        创建Excel文件,如果存在就先删除后创建(保证Excel数据无异常)
        设置Excel title
        :param titles: Excel表单头标题
        """
        # 判断是否存在(如果存在就删除后重新创建,保证Excel数据无异常)
        if os.path.exists(self.fileName):
            # 删除文件
            os.remove(self.fileName)
        # 创建文件
        wb = openpyxl.Workbook()
        sheet = wb.active
        sheet.title = self.sheetName
        wb.save(self.fileName)
        if titles is not None:
            for i in enumerate(titles):
                self.write_excel_data(1, int(i[0]) + 1, value=i[1])

    def __open_excel(self):
        """
        打开工作簿,选中表单
        """
        self.wb = openpyxl.load_workbook(self.fileName)
        self.sh = self.wb[self.sheetName]

    def save(self):
        """
        保存工作簿对象的方法
        """
        self.wb.save(self.fileName)
        self.wb.close()  # 释放内存

    def write_excel_data(self, row, column, value):
        """
        写入数据
        :param row: 行
        :param column: 列
        :param value: 数据
        """
        self.__open_excel()
        # 指定行列进行写入数据
        self.sh.cell(row=row, column=column, value=value)

        # 保存
        self.save()

四、编写GUI窗口,使用PyQt5

1、安装PyQt5
pip install pyqt5
2、完整代码
from PyQt5.QtGui import QIcon

from common.ExcelData import ExcelData
from common.XMindData import XMindData

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QFileDialog, QTableWidget, \
    QTableWidgetItem, QAbstractItemView, QMessageBox


class PyxMind(QWidget):

    def __init__(self):
        super(PyxMind, self).__init__()
        self.row = 1
        self.column = 4
        self.initUi()

    def initUi(self):
        self.setWindowTitle("XMind转换成Excel")
        self.setWindowIcon(QIcon("./Icon/window.ico"))
        self.resize(500, 400)

        layout = QVBoxLayout()

        # 使用水平布局
        self.tablewidget = QTableWidget()

        self.tablewidget.setColumnCount(self.column)
        self.tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)  # 设置表格的选取方式是行选取
        self.tablewidget.setSelectionMode(QAbstractItemView.SingleSelection)  # 设置选取方式为单个选取
        self.tablewidget.setHorizontalHeaderLabels(['#ID', '需求名', '用例目录', '用例名称'])
        self.tablewidget.itemChanged.connect(self.table_update)

        self.button1 = QPushButton("选择XMind文件")
        self.button1.clicked.connect(self.read_XMind)

        self.button2 = QPushButton("转成Excel")
        self.button2.clicked.connect(self.to_Excel)

        layout.addWidget(self.tablewidget)
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)

        self.setLayout(layout)

    def read_XMind(self):
        """
        读取XMind数据
        """
        # 打开XMind文件
        fileName, _ = QFileDialog.getOpenFileName(self, "打开文件", ".", "XMind(*.xmind)")
        # 读取XMind,获取第一个画布,然后获取头节点内容
        ds = XMindData.read_XMind_to_list(fileName)[0]["topic"]
        # 获取头节点title,就是需求名
        title = ds["title"]
        # 获取头节点下的其余所有节点内容
        nodes_data = ds["topics"]
        # 创建XMData格式化xMind读取的数据
        md = XMindData()
        # 清空缓存数据
        md.clear_init_list_data()
        # 调用
        data = md.get_lists_data(data=nodes_data)
        # 动态设置行
        self.row = len(data)
        # 设置表格的行
        self.tablewidget.setRowCount(self.row)
        for case in enumerate(data):
            # id
            item1 = QTableWidgetItem(str(case[0] + 1))
            # 需求名
            item2 = QTableWidgetItem(title)
            # 模块名
            item3 = QTableWidgetItem(case[1][0])
            # 用例
            item4 = QTableWidgetItem("_".join(case[1][1:]))

            self.tablewidget.setItem(case[0], 0, item1)
            self.tablewidget.setItem(case[0], 1, item2)
            self.tablewidget.setItem(case[0], 2, item3)
            self.tablewidget.setItem(case[0], 3, item4)

    def table_update(self):
        """
        如果表格被编辑,则会保存编辑后的数据
        """
        self.tablewidget.selectedItems()

    def to_Excel(self):
        """
        保存到Excel中
        """
        # 返回值是一个元祖,需要两个参数接收,第一个是文件名,第二个是文件类型
        fileName, fileType = QFileDialog.getSaveFileName(self, "保存Excel", ".", "xlsx(*.xlsx)")

        if fileName == "":
            return
        else:
            try:
                if not fileName.endswith('.xlsx'):
                    # 如果后缀不是.xlsx,那么就加上后缀
                    fileName = fileName + '.xlsx'
                we = ExcelData(file_name=fileName)
                # 创建Excel
                we.creat_excel_and_set_title(titles=['#ID', '需求名', '用例目录', '用例名称'])
                # 保存并写入(表格中更新后的数据)写入从第二行开始写入(行需要+1,列需要+1)
                for r in range(self.row):
                    for c in range(self.column):
                        we.write_excel_data(row=r + 2, column=c + 1, value=self.tablewidget.item(r, c).text())
                QMessageBox.about(self, "写入Excel", "写入Excel成功!\n路径:{}".format(fileName))
            except Exception as e:
                QMessageBox.critical(self, "写入Excel", "出错了,请重试!!!\n错误信息:{}".format(e), QMessageBox.Yes, QMessageBox.Yes)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = PyxMind()
    main.show()
    sys.exit(app.exec_())

五、效果图展示

1、启动

启动

2、选择XMind文件

在这里插入图片描述

3、选择后,table表格展示数据

在这里插入图片描述

4、转成Excel,选择要保存的路径

在这里插入图片描述

5、写入成功提示

在这里插入图片描述

6、查看Excel数据

在这里插入图片描述

六、总结

写入的数据可以根据自己的实际情况进行调整(调整to_Excel槽函数和read_XMind槽函数),
源码在我的Gitee上:https://gitee.com/desireyang/py-xmind
希望对您有所帮助

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Python中的xmindparser库来将xmind文件换为excel文件。首先,需要导入xmindparser库,并调用其中的xmind_to_dict函数来读取xmind文件的内容。然后,可以使用openpyxl库来创建一个excel文件,并将xmind内容写入excel文件中。下面是一个示例代码: ```python from xmindparser import xmind_to_dict import openpyxl def xmind_to_excel(xmind_file, excel_file): xmind_content = xmind_to_dict(xmind_file)[0]['topic'] # 读取xmind内容 workbook = openpyxl.Workbook() # 创建一个excel文件 worksheet = workbook.active for i, row in enumerate(xmind_content): for j, cell in enumerate(row): worksheet.cell(row=i+1, column=j+1, value=cell) workbook.save(excel_file) # 保存excel文件 xmind_file = 'path/to/xmind/file.xmind' excel_file = 'path/to/excel/file.xlsx' xmind_to_excel(xmind_file, excel_file) ``` 这段代码中,我们首先使用xmind_to_dict函数读取xmind文件的内容,然后创建一个excel文件并获取到其中的默认工作表。接下来,我们将xmind内容逐个写入excel文件的单元格中。最后,通过调用workbook.save函数保存excel文件。你可以将xmind_file和excel_file分别替换成你实际的文件路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python实现XmindExcel工具](https://blog.csdn.net/m0_49949392/article/details/124142871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值