python将excel中父子关系生成树并写入新excel
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):
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()
浙公网安备 33010602011771号