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的Supervisor进行进程监控以及自动启动
May 29 Python
Python实现的Google IP 可用性检测脚本
Apr 23 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
Python 3中的yield from语法详解
Jan 18 Python
详解python函数传参是传值还是传引用
Jan 16 Python
详解python中sort排序使用
Mar 23 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
Jul 19 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
深入了解如何基于Python读写Kafka
Dec 31 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
python实现简易自习室座位预约系统
Jun 30 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
Symfony的安装和配置方法
2016/03/17 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
js实现内置计时器
2019/12/16 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
python判断字符串是否包含子字符串的方法
2015/03/24 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
利用python画一颗心的方法示例
2017/01/31 Python
Python单例模式实例详解
2017/03/01 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
Python饼状图的绘制实例
2019/01/15 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
pandas 空数据处理方法详解
2019/11/02 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
大学新生军训个人的自我评价
2013/10/03 职场文书
小学生家长评语集锦
2014/01/30 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js