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实现扫描端口示例
Mar 29 Python
python之PyMongo使用总结
May 26 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
利用ImageAI库只需几行python代码实现目标检测
Aug 09 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
详解python中*号的用法
Oct 21 Python
pytorch: Parameter 的数据结构实例
Dec 31 Python
Python requests上传文件实现步骤
Sep 15 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
一些让Python代码简洁的实用技巧总结
Aug 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
?繁体转换的class
2006/10/09 PHP
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
vue.js语法及常用指令
2017/10/29 Javascript
JavaScript实现多态和继承的封装操作示例
2018/08/20 Javascript
微信小程序实现留言板
2018/10/31 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
python对html代码进行escape编码的方法
2015/05/04 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
用pycharm开发django项目示例代码
2018/10/24 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
应届生求职推荐信
2013/10/28 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书