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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
python进阶教程之模块(module)介绍
Aug 30 Python
Php多进程实现代码
May 07 Python
Python读取指定日期邮件的实例
Feb 01 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
python中pygame安装过程(超级详细)
Aug 04 Python
python自动保存百度盘资源到百度盘中的实例代码
Aug 26 Python
python DataFrame转dict字典过程详解
Dec 26 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
python spilt()分隔字符串的实现示例
May 21 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/12/05 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
PHP实现微信提现功能
2018/09/30 PHP
javascript 验证日期的函数
2010/03/18 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
浅谈React高阶组件
2018/03/28 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
python Pandas 读取txt表格的实例
2018/04/29 Python
python 常用的基础函数
2018/07/10 Python
python递归全排列实现方法
2018/08/18 Python
python实现趣味图片字符化
2019/04/30 Python
快速查找Python安装路径方法
2020/02/06 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
世界读书日的活动方案
2014/08/20 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
教师个人年终总结
2015/02/11 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
delete in子查询不走索引问题分析
2022/07/07 MySQL