欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python使用xlsxwriter實(shí)現(xiàn)有向無環(huán)圖到Excel的轉(zhuǎn)換

 更新時間:2018年12月12日 10:54:06   作者:Lockeyi  
這篇文章主要為大家詳細(xì)介紹了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)文章

最新評論