python使用xlsxwriter实现有向无环图到Excel的转换
作者:Lockeyi 时间:2022-01-24 06:42:54
本程序将使用字典来构建有向无环图,然后遍历图将其转换为对应的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
标签:python,xlsxwriter,Excel
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
TensorFlow2.1.0最新版本安装详细教程
2021-11-08 00:14:02
![](https://img.aspxhome.com/file/2023/5/93835_0s.jpg)
Linux下MySQL整个数据库的备份与还原
2008-12-29 13:20:00
F.conv2d pytorch卷积计算方式
2021-06-26 07:38:41
![](https://img.aspxhome.com/file/2023/4/100854_0s.jpg)
Python简单I/O操作示例
2021-11-06 04:42:24
了解WEB页面工具语言XML(一)产生背景
2008-09-05 17:18:00
asp如何用HtmlEncode来显示Unicode编码?
2010-06-12 12:49:00
详解Python list 与 NumPy.ndarry 切片之间的对比
2023-02-16 10:25:23
php过滤器使用详解
2023-06-13 01:52:23
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2023-02-23 13:43:45
![](https://img.aspxhome.com/file/2023/7/65017_0s.png)
如何利用Python随机从list中挑选一个元素
2023-08-04 00:05:54
什么样的图标更具有可用性
2007-10-16 17:47:00
![](https://img.aspxhome.com/file/UploadPic/200710/16/20071016174919899s.jpg)
Django压缩静态文件的实现方法详析
2023-06-15 05:31:33
Django 删除upload_to文件的步骤
2022-03-23 05:47:14
![](https://img.aspxhome.com/file/2023/7/107627_0s.jpg)
详谈Python中列表list,元祖tuple和numpy中的array区别
2021-02-04 12:14:28
Python Django模板之模板过滤器与自定义模板过滤器示例
2023-10-31 20:37:48
Python入门_浅谈逻辑判断与运算符
2023-11-09 05:45:26
![](https://img.aspxhome.com/file/2023/8/64668_0s.png)
asp 延时 页面延迟的三种方法
2011-03-31 11:04:00
Python 自由定制表格的实现示例
2023-11-11 16:54:41
php短视频源码之瀑布流分割线左右间距问题及解决代码
2023-06-12 00:27:07
python数据可视化Pyecharts库sankey修改桑葚图颜色
2023-09-04 08:56:13
![](https://img.aspxhome.com/file/2023/5/76765_0s.jpg)