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 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
Python 创建空的list,以及append用法讲解
May 04 Python
python中单下划线_的常见用法总结
Jul 10 Python
Sanic框架请求与响应实例分析
Jul 16 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
Django model update的多种用法介绍
Mar 28 Python
python使用requests.session模拟登录
Aug 09 Python
Python函数装饰器原理与用法详解
Aug 16 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
Python中Subprocess的不同函数解析
Dec 10 Python
Python操作Excel把数据分给sheet
May 20 Python
Python基础之Socket通信原理
Apr 22 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采集速度探究总结(原创)
2008/04/18 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
js里怎么取select标签里的值并修改
2012/12/10 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
2017/09/11 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
python实现的文件夹清理程序分享
2014/11/22 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
python实现合并两个排序的链表
2019/03/03 Python
如何通过Python实现标签云算法
2019/07/02 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
好的自荐信的要求
2013/10/30 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
物资采购管理制度
2015/08/06 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
MySQL创建管理HASH分区
2022/04/13 MySQL
python区块链持久化和命令行接口实现简版
2022/05/25 Python