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()