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列表去重的二种方法
Feb 14 Python
python执行shell获取硬件参数写入mysql的方法
Dec 29 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
python Shapely使用指南详解
Feb 18 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
Python容器类型公共方法总结
Aug 19 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 array_push 数组函数
2009/12/26 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
javascript 获取图片颜色
2009/04/05 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
需要牢记的JavaScript基础知识
2016/09/25 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
python版简单工厂模式
2017/10/16 Python
简单实现Python爬取网络图片
2018/04/01 Python
使用matplotlib画散点图的方法
2018/05/25 Python
Python实现扫码工具的示例代码
2020/10/09 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
超市国庆节促销方案
2014/02/20 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
还款承诺书范本
2015/01/20 职场文书
2015年统战工作总结
2015/05/19 职场文书
公司开业致辞
2015/07/29 职场文书
清明节随笔
2015/08/15 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
五年级语文教学反思
2016/03/03 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js