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的pycurl包用法简介
Nov 13 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
在Python中给Nan值更改为0的方法
Oct 30 Python
python匿名函数用法实例分析
Aug 03 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
Python3 assert断言实现原理解析
Mar 02 Python
Python itertools.product方法代码实例
Mar 27 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
Python Selenium模块安装使用教程详解
Jul 09 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
第六节--访问属性和方法
2006/11/16 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
javascript定时器完整实例
2015/02/10 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
资深地理教师自我评价
2013/09/21 职场文书
小学中秋节活动方案
2014/02/06 职场文书
授权委托书怎么写
2014/04/03 职场文书
一年级评语大全
2014/04/23 职场文书
安徽导游词
2015/02/12 职场文书
python 如何用terminal输入参数
2021/05/25 Python
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js