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中使用Inotify监控文件实例
Feb 14 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
Python random模块用法解析及简单示例
Dec 18 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
pip安装tensorflow的坑的解决
Apr 19 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
pandas进行数据输入和输出的方法详解
Mar 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
星际流派综述
2020/03/04 星际争霸
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
php读取本地json文件的实例
2018/03/07 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
javascript数组去重方法分析
2016/12/15 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Django forms组件的使用教程
2018/10/08 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
美国钻石商店:Zales
2016/11/20 全球购物
laravel使用redis队列实例讲解
2021/03/23 PHP
义和团口号
2014/06/17 职场文书
机关作风建设整改方案
2014/10/27 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
大学生社会实践感想
2015/08/11 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Python中相见恨晚的技巧
2021/04/13 Python