python使用xlsxwriter实现有向无环图到Excel的转换
作者:Lockeyi 发布时间:2022-01-24 06:42:54
标签:python,xlsxwriter,Excel
本程序将使用字典来构建有向无环图,然后遍历图将其转换为对应的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')
来源:https://blog.csdn.net/Lockey23/article/details/81254794


猜你喜欢
- 实现一个AuditLog的功能,是B/S结构专案。 每个用户可以登录系统,在程序中操作数据(添加,更新和删除)需要实现记录操作跟踪。是谁添加
- Python是一种广泛使用的编程语言,特别是在数据分析、机器学习和人工智能领域。在Python中,字符串是一个非常重要的数据类型,可用来存储
- 多值运动,也就是对于某个对象来说,不仅仅只是其中一个属性值在变化,而是好多个,比如宽,高,字体,透明度等等同时变化当然了,多值运动会产生一个
- RabbitMQ可以当做一个消息代理,它的核心原理非常简单:即接收和发送消息,可以把它想象成一个邮局:我们把信件放入邮箱,邮递员就会把信件投
- 本文实例讲述了Python爬虫实现“盗取”微信好友信息的方法。分享给大家供大家参考,具体如下:刚起床,闲来无聊,找点事做,看了朋友圈一篇爬取
- 本文为大家分享了Linux环境下mysql5.6.24自动安装脚本代码,供大家参考,具体内容如下说明:一、本脚本仅供测试使用,若正式环境想要
- 我就废话不多说了,大家还是直接看代码吧~package mainimport ("fmt""net/url&q
- python封装简介1.效果图:对比一:对比二:2.学习来源代码:# 封装是面向对象的三大特性之一# 封装指的是隐藏对象中一些不希望被外部所
- 先设定一个关系模型如下:from django.db import modelsclass Blog(models.Model): name
- 以行的形式读出一个文件最简单的方式是使用文件对象的readline()、readlines()和xreadlines()方法。Python2
- BatchNorm2d中的track_running_stats参数如果BatchNorm2d的参数val,track_running_st
- 前言Django项目本身就可以启动运行,为什么还需要部署到Apache或者Nginx上呢?初学者都会遇到这个问题,我们来看看官方解释:It&
- 图片的上传上传图片使用了表单提交, 下面是html部分, enctype="multipart/form-data"表示
- python之参数,定义时小括号中的参数,用来接收参数用的,称为 “形参”调用时小括号中的参数,用来传递给函数用的,称为 “实参”。1、思考
- 这个是捕获键盘事件输入状态的js代码,它可以判断你敲打了键盘的那个键,ctrl、shift,26个字母等等,返回具体键盘值。Javascri
- 代码如下:'============================== '格式化HTML,SDCMS加强版 '==
- PYTHON是一门动态解释性的强类型定义语言:编写时无需定义变量类型;运行时变量类型强制固定;无需编译,在解释器环境直接运行。动态和静态静态
- 啥也不说了,大家还是直接看图吧!补充知识:python http request header主要内容http request 请求头主要包
- 打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢?到底该装 Python2 呢还是 Python3 ?为什么安装 P
- FULLTEXT以前使用查找时都是以 %关键字% 进行模糊查询结果的,这种查询方式有一些缺点,比如不能查询多个列必须手动添加条件以实现,效率