python使用xlsxwriter实现有向无环图到Excel的转换

作者:Lockeyi 时间:2022-01-24 06:42:54 

本程序将使用字典来构建有向无环图,然后遍历图将其转换为对应的Excel文件

最终结果如下:

python使用xlsxwriter实现有向无环图到Excel的转换

代码:


(py3) [root@7-o-1 py-dag]# cat test.py
from dag import DAG
dag = DAG()
dag.from_dict({'a': ['b', 'c','e'],
    'b': ['d','g'],
    'c': ['d'],
    'g':['i'],
    'i':[],
    'e':['gh','ox','wer'],
    'gh':[],
    'ox':[],
    'wer':[],
    'd': []})

def generate_excel(dag, row_start,col,excel_file):#参数分别为有向无环图图、开始写入的行,开始写入列,以及文件名
import xlsxwriter#导入Excel操作模块
workbook = xlsxwriter.Workbook(excel_file)#创建Excel文件
worksheet = workbook.add_worksheet('testsheet')#创建工作簿
#以下为部分格式的预定义(包含合并行格式,数字日期格式等)
merge_format = workbook.add_format({
'bold': 1,
'border': 1,
'align': 'left',
'valign': 'vcenter'})

cell_format = workbook.add_format({
'bold': 1,
'border': 1,
'align': 'top',
'valign': 'left'})

date_format = workbook.add_format({
'bold': 1,
'border': 1,
'align': 'top',
'valign': 'left',
'num_format': 'd mmmm yyyy'})

num_format = workbook.add_format({
'bold': 1,
'border': 1,
'align': 'top',
'valign': 'left',
'num_format': '0.0000%'})

def get_node_leaves(node,ret = []):#用来返回一个节点的所有最终叶子结点
  downs = dag.downstream(node)#先获取当前节点的下一级节点
  if len(downs) < 1:#如果无下一级节点将直接将此节点添加到列表
   ret.append(node)
  else:#负责循环递归,将所有叶子结点添加到列表
   for inner_node in downs:
    get_node_leaves(inner_node,ret)
  return ret#返回节点列表

def dag_visit(dag, node, r_idx,col):
 if node not in all_leaves:
  downstreams = dag.downstream(node)
  node_leaves = len(get_node_leaves(node,[]))#获取所有叶子的个数,用来判断是否进行合并行操作
  r_idx_end = r_idx+node_leaves-1
  if len(downstreams) == 1:#对于只有一个子节点的node应用write
   worksheet.write(col+str(r_idx), node,cell_format)
  else:#对于多余一个子节点的node应用merge_range
   worksheet.merge_range(col+str(r_idx)+':'+col+str(r_idx_end), node,merge_format)
  col = chr(ord(col)+1)#列+1,开始进入子节点遍历
  downstreams_len = len(downstreams)
  if len(downstreams) >0:
   row_next = r_idx
   for downstream in downstreams:
    subnode_leaves = len(get_node_leaves(downstream,[]))#获取当前节点的所有叶子用来为下一个节点的填充确定位移
    if downstream in all_leaves:
     subnode_leaves = 1
     if col == merge_to:#对于子节点为叶子并且跨度为1应用write
      worksheet.write(col+str(row_next), downstream,cell_format)
     else:#对于子节点为叶子结点但是跨度大于1应用merge_range
      merge_rg = col+str(row_next) +':'+merge_to+str(row_next)
      worksheet.merge_range(merge_rg, downstream,merge_format)
    else:#子节点非叶子结点进行递归遍历
     dag_visit(dag, downstream, row_next,col)
    #每访问一个子结点需要将row值增加方便下一个node正确填充,row的值是前一个结点的子节点个数
    row_next += subnode_leaves

else:
  print(node)

head_node = dag.ind_nodes()[0]
all_leaves = dag.all_leaves()
dag_depth = dag.dag_depth(head_node,0)
merge_to= chr(ord(col)+dag_depth)#对于合并列的终结列index
dag_visit(dag, head_node, row_start,col)#传递根节点进行遍历
workbook.close()
generate_excel(dag,1,'A','test.xlsx')

来源:https://blog.csdn.net/Lockey23/article/details/81254794

标签:python,xlsxwriter,Excel
0
投稿

猜你喜欢

  • 浅谈MySQL的B树索引与索引优化小结

    2024-01-28 15:13:58
  • CodeIgniter连贯操作的底层原理分析

    2024-05-02 17:15:11
  • 对于任意的XML的遍历

    2008-09-05 17:11:00
  • Python深度学习之实现卷积神经网络

    2021-08-11 01:57:01
  • asp select下拉菜单选择图标并实时显示

    2011-04-03 10:33:00
  • 对Python中 \\r, \\n, \\r\\n的彻底理解

    2022-09-14 07:00:15
  • 在TABLE中模仿excel的单元格移动

    2007-12-22 12:03:00
  • mysqldump备份还原和mysqldump导入导出语句大全详解

    2024-01-14 07:35:14
  • 全面理解JavaScript中的闭包

    2024-04-17 10:09:24
  • python+Django实现防止SQL注入的办法

    2022-05-22 13:13:13
  • pycharm安装包失败的解决方法

    2022-03-29 04:24:04
  • Golang 操作TSV文件的实战示例

    2023-07-18 06:46:01
  • 对python中的xlsxwriter库简单分析

    2022-08-22 22:46:01
  • js实现百度地图定位于地址逆解析,显示自己当前的地理位置

    2024-05-08 10:12:04
  • 浅谈MySQL 有哪些死锁场景

    2024-01-13 13:45:54
  • 对numpy Array [: ,] 的取值方法详解

    2023-02-05 17:33:23
  • 详解Windows下安装Nodejs步骤

    2024-05-03 15:56:34
  • 如何用Pytorch搭建一个房价预测模型

    2022-12-16 17:09:21
  • golang中json的omitempty使用操作

    2024-05-13 09:06:44
  • python基于exchange函数发送邮件过程详解

    2021-03-23 02:12:22
  • asp之家 网络编程 m.aspxhome.com