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 Socket网络编程
Jan 05 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
python中 logging的使用详解
Oct 25 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
python实现一个简单的ping工具方法
Jan 31 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
Python 实现try重新执行
Dec 21 Python
解决python3中os.popen()出错的问题
Nov 19 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 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
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
PHP stream_context_create()作用和用法分析
2011/03/29 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
tensorflow之并行读入数据详解
2020/02/05 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
python try...finally...的实现方法
2020/11/25 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记