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

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄