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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
python调用短信猫控件实现发短信功能实例
Jul 04 Python
python正则表达式的使用
Jun 12 Python
Python自定义线程类简单示例
Mar 23 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
Python对象的属性访问过程详解
Mar 05 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
基于python检查矩阵计算结果
May 21 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
python 如何利用argparse解析命令行参数
Sep 11 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封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
Javascript 定时器调用传递参数的方法
2009/11/12 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
常见的python正则用法实例讲解
2016/06/21 Python
Python实现网站表单提交和模板
2019/01/15 Python
python取均匀不重复的随机数方式
2019/11/27 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
工作中的自我评价如何写好
2013/10/28 职场文书
函授本科自我鉴定
2014/02/04 职场文书
上课不认真检讨书
2014/09/17 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
优质服务标语口号
2015/12/26 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
Python合并多张图片成PDF
2021/06/09 Python