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中用Spark模块的使用教程
Apr 13 Python
Python3.6.0+opencv3.3.0人脸检测示例
May 25 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
python的sorted用法详解
Jun 25 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
pygame实现俄罗斯方块游戏(基础篇1)
Oct 29 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
基于python+selenium的二次封装的实现
Jan 06 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
python对一个数向上取整的实例方法
Jun 18 Python
详解Python openpyxl库的基本应用
Feb 26 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
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
Python中 Lambda表达式全面解析
2016/11/28 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
python中自带的三个装饰器的实现
2019/11/08 Python
python读取mysql数据绘制条形图
2020/03/25 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
计算机开发个人求职信范文
2013/09/26 职场文书
自荐信的五个重要部分
2013/10/29 职场文书
施工安全协议书
2013/12/11 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
幽灵公主观后感
2015/06/09 职场文书