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

