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


Posted in Python onDecember 12, 2018

本程序将使用字典来构建有向无环图,然后遍历图将其转换为对应的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')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
Django中的DateTimeField和DateField实现
Feb 24 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 Python
OpenCV-Python实现油画效果的实例
Jun 08 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 #Python
在python中pandas读文件,有中文字符的方法
Dec 12 #Python
python处理两种分隔符的数据集方法
Dec 12 #Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 #Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
Dec 12 #Python
对python制作自己的数据集实例讲解
Dec 12 #Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 #Python
You might like
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
2014/08/19 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
Python 解析XML文件
2009/04/15 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
Python画图高斯分布的示例
2019/07/10 Python
Django实现文件上传下载功能
2019/10/06 Python
python实现淘宝购物系统
2019/10/25 Python
python中元组的用法整理
2020/06/15 Python
Python创建自己的加密货币的示例
2021/03/01 Python
什么是唯一索引
2015/07/05 面试题
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
个人校本研修方案
2014/05/26 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
九九重阳节致辞
2015/07/31 职场文书
重阳节主题班会
2015/08/17 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Python多线程 Queue 模块常见用法
2021/07/04 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript