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采集腾讯新闻实例
Jul 10 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
python实现提取百度搜索结果的方法
May 19 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
分析Python中解析构建数据知识
Jan 20 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
如何利用Python开发一个简单的猜数字游戏
Sep 22 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 Python
Python各协议下socket黏包问题原理
Apr 12 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
虫族 ZERG 概述
2020/03/14 星际争霸
判断PHP数组是否为空的代码
2011/09/08 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
php判断变量类型常用方法
2012/04/24 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
IE autocomplete internet explorer's autocomplete
2007/06/30 Javascript
javascript Object与Function使用
2010/01/11 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
python随机生成库faker库api实例详解
2019/11/28 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
学年自我鉴定范文
2013/10/01 职场文书
班组安全员工作职责
2014/02/01 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
导师工作推荐信范文
2014/05/17 职场文书
毕业生工作求职信
2014/06/30 职场文书
工程安全生产协议书
2014/11/21 职场文书
2014年技术部工作总结
2014/12/12 职场文书
行政申诉状范文
2015/05/20 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技