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计算字符宽度的方法
Jun 14 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
在dataframe两列日期相减并且得到具体的月数实例
Jul 03 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python生成带有表格的图片实例
Feb 03 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
Python 字典中的所有方法及用法
Jun 10 Python
Python自动发送和收取邮件的方法
Aug 12 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP生成压缩文件实例
2015/02/07 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
python pyenv多版本管理工具的使用
2019/12/23 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
单位介绍信范文
2014/01/18 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
后勤工作个人总结
2015/02/28 职场文书
手机销售员岗位职责
2015/04/11 职场文书
运动会观后感
2015/06/09 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
MySQL数据库事务的四大特性
2022/04/20 MySQL