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 相关文章推荐
python集合用法实例分析
May 30 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
python中for用来遍历range函数的方法
Jun 08 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
python cv2截取不规则区域图片实例
Dec 21 Python
python实现对变位词的判断方法
Apr 05 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
python3 kubernetes api的使用示例
Jan 12 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
opencv读取视频并保存图像的方法
Jun 04 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
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
苹果Mac升级:MacSales.com
2017/11/20 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
大学四年个人的自我评价
2014/02/26 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
走进敬老院活动总结
2014/07/10 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
详解Laravel框架的依赖注入功能
2021/05/27 PHP