Cоздание иерархического дерева на python на основании данных из excel

Рейтинг: 0Ответов: 1Опубликовано: 10.05.2023

Есть данные в эксель таблице(скрине только кусок файла, на самом деле там огромная структура):

введите сюда описание изображения

Необходимо на основании этих данных написать программу на Python, которая будет отображать эти данные в виде дерева (как на примере ниже):

введите сюда описание изображения

Иерархия на самом деле сложная и громоздкая, в файле Excel присутствую такие поля как ID папки, ее название, ID родительской структуры и уровень вложенности.

....пересматривал кучу примеров с tkinter Treeview, QTreeWidget, ни одного подходящего примера не нашел. Подскажите, пожалуйста, как проще всего сделать ? Я данные из эксель переливал в словарь но дальше не понятно как мне циклом их загрузить в само дерево.

Ответы

▲ 1Принят

Используем pandas и PyQt6.TreeWidget ознакомьтесь с примером:

import sys

import pandas as pd
from PyQt6.QtWidgets import QApplication, QWidget, QHBoxLayout, QTreeWidgetItem, QTreeWidget


class MainWindow(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setWindowTitle('Example')
        self.resize(640, 480)

        layout = QHBoxLayout()
        self.setLayout(layout)

        self.tree_view = QTreeWidget(self)
        self.layout().addWidget(self.tree_view)

        self.load_xlsx('file.xlsx')

        self.show()

    def load_xlsx(self, path):
        df = pd.read_excel(path)  # Читаем exel файл с помощью pandas

        elements = {}

        items = []

        for row in df.values:
            element = QTreeWidgetItem([row[1], row[0]])  # Создаём новый элемент
            elements[row[0]] = element

        for row in df.values:
            element = elements[row[0]]
            if str(row[2]) == 'nan':  # Если элемент не является предком кого либо
                items.append(element)  # Добавляем его в список корневых элементов
            else:
                elements[row[2]].addChild(element)  # Иначе добавляем его родителю в качестве элемента
        self.tree_view.insertTopLevelItems(0, items)  # Добавляем все корневые элементы на дерево


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

Структура файла file.xlsx Id могут быть любыми:
введите сюда описание изображения