python使用xlsxwriter實(shí)現(xiàn)有向無環(huán)圖到Excel的轉(zhuǎn)換
本程序?qū)⑹褂米值鋪順?gòu)建有向無環(huán)圖,然后遍歷圖將其轉(zhuǎn)換為對(duì)應(yīng)的Excel文件
最終結(jié)果如下:

代碼:
(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):#參數(shù)分別為有向無環(huán)圖圖、開始寫入的行,開始寫入列,以及文件名
import xlsxwriter#導(dǎo)入Excel操作模塊
workbook = xlsxwriter.Workbook(excel_file)#創(chuàng)建Excel文件
worksheet = workbook.add_worksheet('testsheet')#創(chuàng)建工作簿
#以下為部分格式的預(yù)定義(包含合并行格式,數(shù)字日期格式等)
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 = []):#用來返回一個(gè)節(jié)點(diǎn)的所有最終葉子結(jié)點(diǎn)
downs = dag.downstream(node)#先獲取當(dāng)前節(jié)點(diǎn)的下一級(jí)節(jié)點(diǎn)
if len(downs) < 1:#如果無下一級(jí)節(jié)點(diǎn)將直接將此節(jié)點(diǎn)添加到列表
ret.append(node)
else:#負(fù)責(zé)循環(huán)遞歸,將所有葉子結(jié)點(diǎn)添加到列表
for inner_node in downs:
get_node_leaves(inner_node,ret)
return ret#返回節(jié)點(diǎn)列表
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,[]))#獲取所有葉子的個(gè)數(shù),用來判斷是否進(jìn)行合并行操作
r_idx_end = r_idx+node_leaves-1
if len(downstreams) == 1:#對(duì)于只有一個(gè)子節(jié)點(diǎn)的node應(yīng)用write
worksheet.write(col+str(r_idx), node,cell_format)
else:#對(duì)于多余一個(gè)子節(jié)點(diǎn)的node應(yīng)用merge_range
worksheet.merge_range(col+str(r_idx)+':'+col+str(r_idx_end), node,merge_format)
col = chr(ord(col)+1)#列+1,開始進(jìn)入子節(jié)點(diǎn)遍歷
downstreams_len = len(downstreams)
if len(downstreams) >0:
row_next = r_idx
for downstream in downstreams:
subnode_leaves = len(get_node_leaves(downstream,[]))#獲取當(dāng)前節(jié)點(diǎn)的所有葉子用來為下一個(gè)節(jié)點(diǎn)的填充確定位移
if downstream in all_leaves:
subnode_leaves = 1
if col == merge_to:#對(duì)于子節(jié)點(diǎn)為葉子并且跨度為1應(yīng)用write
worksheet.write(col+str(row_next), downstream,cell_format)
else:#對(duì)于子節(jié)點(diǎn)為葉子結(jié)點(diǎn)但是跨度大于1應(yīng)用merge_range
merge_rg = col+str(row_next) +':'+merge_to+str(row_next)
worksheet.merge_range(merge_rg, downstream,merge_format)
else:#子節(jié)點(diǎn)非葉子結(jié)點(diǎn)進(jìn)行遞歸遍歷
dag_visit(dag, downstream, row_next,col)
#每訪問一個(gè)子結(jié)點(diǎn)需要將row值增加方便下一個(gè)node正確填充,row的值是前一個(gè)結(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù)
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)#對(duì)于合并列的終結(jié)列index
dag_visit(dag, head_node, row_start,col)#傳遞根節(jié)點(diǎn)進(jìn)行遍歷
workbook.close()
generate_excel(dag,1,'A','test.xlsx')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)腳本鎖功能(同時(shí)只能執(zhí)行一個(gè)腳本)
這篇文章主要介紹了Python實(shí)現(xiàn)腳本鎖功能(同時(shí)只能執(zhí)行一個(gè)腳本),本文給大家分享了兩種方法,大家可以根據(jù)個(gè)人所需選擇適合自己的方法2017-05-05
Python 創(chuàng)建新文件時(shí)避免覆蓋已有的同名文件的解決方法
今天小編就為大家分享一篇Python 創(chuàng)建新文件時(shí)避免覆蓋已有的同名文件的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python?eval()函數(shù)和ast.literal_eval()的區(qū)別你知道嗎
這篇文章主要為大家詳細(xì)介紹了Python?eval()函數(shù)和ast.literal_eval()的區(qū),文中圖片代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
Python OpenCV實(shí)現(xiàn)識(shí)別信用卡號(hào)教程詳解
本文將介紹如何通過 OpenCV 和 Python 使用模板匹配來執(zhí)行光學(xué)字符識(shí)別 (OCR),再應(yīng)用我們的模板匹配 OCR 方法來識(shí)別信用卡類型以及 16 位信用卡數(shù)字。代碼具有一定價(jià)值,感興趣的童鞋可以了解一下2021-11-11
pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性
這篇文章主要為大家介紹了pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
python庫umap有效地揭示高維數(shù)據(jù)的結(jié)構(gòu)和模式初探
這篇文章主要介紹了python庫umap有效地揭示高維數(shù)據(jù)的結(jié)構(gòu)和模式初探,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

