python将excel中父子关系生成树并写入新excel
Excel中的数据是按照工单号存储的,且存在如下关系:
工单——母工单——上阶工单
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。需要分析整理成 母工单——一阶工单——二阶工单……形式的树状关系图。
思路:
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):
class Excel: 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') #将原始文件转换为列表,核心字段为工单号、母工单、上阶工单 def origin2list(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 in m_order_all: if item != '' and item != table.col(4)[0].value and {'name': item} not in m_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 in order_all: if item not in order_list: order_list.append(item) # 返回母工单、所有工单列表 return m_order_list, order_list # 将树按照格式写入excel文件 def tree2excel(self, tree): # 增加一个sheet, 命名为root节点名 table = self.workbook.add_sheet(tree.root.value) # 递归写入表格 def write_recursive(node, table, r, c): global rnum #此处用了个全局变量,在开头声明 table.write(r, c, node.value) if len(node.children) == 0: rnum = rnum + 1 else: for child in node.children: write_recursive(child, table, rnum, c + 1) write_recursive(tree.root, table, rnum, 0) # 保存 self.workbook.save(self.dest_file) # 分析原始数据、并写入目标excel def data_analysis(self): root_list, order_list = self.origin2list() for item in root_list: tree = Tree() tree.gen_tree(item['name'], order_list) self.tree2excel(tree)
调用:
if __name__ == '__main__': excel = Excel('../1.项目/0102工单.xls') excel.data_analysis()

更多精彩