python使用xlsxwriter實(shí)現(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é)點(diǎn)的所有最終葉子結(jié)點(diǎn) downs = dag.downstream(node)#先獲取當(dāng)前節(jié)點(diǎn)的下一級節(jié)點(diǎn) if len(downs) < 1:#如果無下一級節(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,[]))#獲取所有葉子的個數(shù),用來判斷是否進(jìn)行合并行操作 r_idx_end = r_idx+node_leaves-1 if len(downstreams) == 1:#對于只有一個子節(jié)點(diǎn)的node應(yīng)用write worksheet.write(col+str(r_idx), node,cell_format) else:#對于多余一個子節(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)的所有葉子用來為下一個節(jié)點(diǎn)的填充確定位移 if downstream in all_leaves: subnode_leaves = 1 if col == merge_to:#對于子節(jié)點(diǎn)為葉子并且跨度為1應(yīng)用write worksheet.write(col+str(row_next), downstream,cell_format) else:#對于子節(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) #每訪問一個子結(jié)點(diǎn)需要將row值增加方便下一個node正確填充,row的值是前一個結(jié)點(diǎn)的子節(jié)點(diǎn)個數(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é)點(diǎn)進(jìn)行遍歷 workbook.close() generate_excel(dag,1,'A','test.xlsx')
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
keras實(shí)現(xiàn)theano和tensorflow訓(xùn)練的模型相互轉(zhuǎn)換
這篇文章主要介紹了keras實(shí)現(xiàn)theano和tensorflow訓(xùn)練的模型相互轉(zhuǎn)換,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Windows系統(tǒng)下Chromedriver.exe安裝及配置詳細(xì)教程
ChromeDriver.exe是一款實(shí)用的chrome瀏覽器驅(qū)動工具,能夠用于自動化測試、網(wǎng)絡(luò)爬蟲和操作瀏覽器,其主要作用是模擬瀏覽器操作,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下Chromedriver.exe安裝及配置的相關(guān)資料,需要的朋友可以參考下2023-11-11Python語法學(xué)習(xí)之進(jìn)程的創(chuàng)建與常用方法詳解
本文我們將學(xué)習(xí)一下在?Python?中去創(chuàng)建并使用多進(jìn)程的方法,可以通過創(chuàng)建多個進(jìn)程來幫助我們提高腳本執(zhí)行的效率,感興趣的可以了解一下2022-04-04Python3.6通過自帶的urllib通過get或post方法請求url的實(shí)例
下面小編就為大家分享一篇Python3.6通過自帶的urllib通過get或post方法請求url的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】
這篇文章主要介紹了django框架事務(wù)處理,結(jié)合實(shí)例形式總結(jié)分析了使用ORM 事務(wù)及raw sql,customize sql 事務(wù)處理相關(guān)實(shí)現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2019-06-06