# -*- coding: utf-8 -*- import openpyxl, json, re from copy import copy from openpyxl.styles import PatternFill FN='국립호남권생물자원관.xlsx' BLUE=PatternFill(fill_type='solid', fgColor='FFBDD7EE') BASE='https://www.hnibr.re.kr' tree=json.load(open('_hnibr_gnb.json',encoding='utf-8')) # --- build GNB leaf rows: D=L1,E=L2,F=L3 or None --- rows=[] i=0 while i=2: if tree[i]['lvl']!=2: i+=1; continue L2=tree[i]['t']; l2h=tree[i]['href']; i+=1 kids=[] while i 사이트메뉴 addrec('사이트메뉴','이용약관',None, BASE+'/ko/M000000531/html/view', new=True) # 바로가기 (외부 featured links) for E,url in [('통합예약시스템','https://resve.hnibr.re.kr'),('섬생물소재은행','https://ibis.hnibr.re.kr/bobic'), ('고하도 주변관광','https://www.mokpo.go.kr/tour'),('페이스북','https://www.facebook.com/hnibr.re.kr'), ('블로그','https://blog.naver.com/h_nibr'),('인스타그램','https://www.instagram.com/h_nibr/'), ('유튜브','https://www.youtube.com/@hnibr')]: addrec('바로가기',E,None,url,site=True,new=True) print('records:', len(recs)) # --- WRITE (fresh) --- MAXC=27 # capture a template style per column from an existing data row (row3) and a merge-body row tpl={c:copy(ws.cell(3,c)._style) for c in range(1,MAXC+1)} # unmerge data merges for mr in list(ws.merged_cells.ranges): if mr.min_row>=3: ws.unmerge_cells(str(mr)) # clear all data rows for r in range(3, ws.max_row+1): for c in range(1,MAXC+1): cell=ws.cell(r,c); cell.value=None; cell.hyperlink=None; cell.fill=PatternFill(fill_type=None) SITE='국립호남권생물자원관' n=len(recs) for idx,rc in enumerate(recs): r=3+idx for c in range(1,MAXC+1): ws.cell(r,c)._style=copy(tpl[c]) ws.cell(r,2).value=idx+1 ws.cell(r,3).value=SITE ws.cell(r,4).value=rc['D']; ws.cell(r,5).value=rc['E']; ws.cell(r,6).value=rc['F'] ws.cell(r,11).value=rc['url'] ws.cell(r,11).hyperlink=rc['hlink'] if rc['url'] else None ws.cell(r,12).value=rc['L']; ws.cell(r,13).value=rc['M']; ws.cell(r,14).value=rc['N'] ws.cell(r,15).value=rc['O']; ws.cell(r,19).value=rc['S'] ws.row_dimensions[r].height=15 if rc['new']: for c in range(4,16): ws.cell(r,c).fill=BLUE # re-merge D, E, F def remerge(col, scope): r=3 while r<3+n: v=ws.cell(r,col).value if v is None or v=='': r+=1; continue r2=r while r2+1<3+n: if ws.cell(r2+1,col).value!=v: break ok=all(ws.cell(r2+1,sc).value==ws.cell(r,sc).value for sc in scope) if not ok: break r2+=1 if r2>r: for rr in range(r+1,r2+1): ws.cell(rr,col).value=None ws.merge_cells(start_row=r,start_column=col,end_row=r2,end_column=col) r=r2+1 remerge(6,[4,5]); remerge(5,[4]); remerge(4,[]) wb.save(FN) print('saved', n, 'rows')