python树结构输出到excel_python将excel中父子关系生成树并写入新excel

该博客介绍了如何将Excel中存储的具有父子关系的工单数据,通过Python转换成树状结构,并以特定格式写入新的Excel文件。首先,读取原始Excel文件并构造节点及树结构,然后利用递归生成树,最后将树形结构写入新Excel。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Excel中的数据是按照工单号存储的,且存在如下关系:

工单——母工单——上阶工单

需要分析整理成 母工单——一阶工单——二阶工单……形式的树状关系图。

思路:

1、读取原始文件,转换成一个个工单的list,以及母工单的list

2、以母工单为根节点,生成描述上下阶关系的树

3、将树按照树的样子(不过不是从上到下,二是从左往右,左上角是根节点)写入excel

代码如下:

首先是树相关的类:

# 节点类

class Node:

def __init__(self, value):

self.children = []

self.value = value

def add_child(self, child):

self.children.append(child)

# 树类

class Tree:

def __init__(self):

self.root = None

# 生成树

def gen_tree(self, value, data_list = []):

self.root = Node(value)

# 递归生成树

def gen_tree_recursive(node):

for item in data_list:

if item['parent'] == node.value:

entry_node = gen_tree_recursive(Node(item['name']))

node.add_child(entry_node)

return node

gen_tree_recursive(self.root)

下面是excel操作相关的类(读写excel使用xlrd和xlwt):

classExcel:def __init__(self, origin_file):

self.origin_file=origin_file

self.dest_file= origin_file.split('.xls')[0] + '排产.xls'self.workbook= xlwt.Workbook(encoding='utf-8')#将原始文件转换为列表,核心字段为工单号、母工单、上阶工单

deforigin2list(self):#打开excel文件

data =xlrd.open_workbook(self.origin_file)#获取第一张工作表(通过索引的方式)

table =data.sheets()[0]#获取母工单,可能有多个,所以为list,元素在表格中的位置按实际情况写

m_order_all =[]

m_order_all.extend(table.col_values(4))

m_order_list=[]for item inm_order_all:if item != '' and item != table.col(4)[0].value and {'name': item} not inm_order_list:

m_order_list.append({'name': item})#获取所有工单

nrows =table.nrows

order_all=[]

order_list=[]for i in range(nrows - 1):

order_all.append({'name': table.cell(i + 1, 2).value, 'parent': table.cell(i + 1, 5).value})for item inorder_all:if item not inorder_list:

order_list.append(item)#返回母工单、所有工单列表

returnm_order_list, order_list#将树按照格式写入excel文件

deftree2excel(self, tree):#增加一个sheet, 命名为root节点名

table =self.workbook.add_sheet(tree.root.value)#递归写入表格

defwrite_recursive(node, table, r, c):globalrnum #此处用了个全局变量,在开头声明

table.write(r, c, node.value)if len(node.children) ==0:

rnum= rnum + 1

else:for child innode.children:

write_recursive(child, table, rnum, c+ 1)

write_recursive(tree.root, table, rnum, 0)#保存

self.workbook.save(self.dest_file)#分析原始数据、并写入目标excel

defdata_analysis(self):

root_list, order_list=self.origin2list()for item inroot_list:

tree=Tree()

tree.gen_tree(item['name'], order_list)

self.tree2excel(tree)

调用:

if __name__ == '__main__':

excel= Excel('../1.项目/0102工单.xls')

excel.data_analysis()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值