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调用百度REST API实现语音识别
Aug 30 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
Python配置文件处理的方法教程
Aug 29 Python
python 协程 gevent原理与用法分析
Nov 22 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
Python实现序列化及csv文件读取
Jan 19 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
Numpy ndarray 多维数组对象的使用
Feb 10 Python
pytorch实现ResNet结构的实例代码
May 17 Python
如何在python中实现ECDSA你知道吗
Nov 23 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
基于php下载文件的详解
2013/06/02 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
Thinkphp中数据按分类嵌套循环实现方法
2014/10/30 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
js格式化时间的方法
2015/12/18 Javascript
javascript数组去重小结
2016/03/07 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
Element Badge标记的使用方法
2020/07/27 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
Python中__name__的使用实例
2015/04/14 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
python hash每次调用结果不同的原因
2019/11/21 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
思想政治教育专业个人求职信范文
2013/12/20 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
老人节主持词
2015/07/04 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript