# -*- coding: utf-8 -*- import openpyxl,copy,sys sys.stdout.reconfigure(encoding='utf-8') F='전북특별자치도_완주군.xlsx' B='https://www.wanju.go.kr/index.9is?contentUid=' # (label, url, L) L: 'p'=페이지 's'=사이트 KIDS=[ ('기획예산실',B+'ff8080818b024d8e018b274f9e492de5','p'),('감사담당관',B+'ff8080818b024d8e018b274f9f402dec','p'), ('수소신산업담당관',B+'ff8080818b024d8e018b274fa04a2df3','p'),('행정지원과',B+'ff8080818b024d8e018b274fa1602dfa','p'), ('인구정책과',B+'4028a602975891f70197bf9089d77bae','p'),('교육정책과',B+'ff8080818b024d8e018b274fa3762e08','p'), ('아동친화과',B+'4028a602975891f70197bf98553c7e0d','p'),('재정관리과',B+'ff8080818b024d8e018b274fa8f42e1d','p'), ('열린민원과',B+'ff8080818b024d8e018b274fa9fc2e24','p'),('문화역사과',B+'ff8080818b024d8e018b274fa6932e0f','p'), ('관광축제과',B+'ff8080818b024d8e018b274fa7ba2e16','p'),('체육공원과',B+'4028a602975891f70197bfa1064100eb','p'), ('사회복지과',B+'ff8080818b024d8e018b274fa2772e01','p'),('경로장애인과',B+'4028a6028d7e94de01905d4e5efa0a2c','p'), ('경제정책과',B+'ff8080818b024d8e018b274fabff2e32','p'),('농업정책과',B+'ff8080818b024d8e018b274facff2e39','p'), ('자원순환과',B+'ff8080818b024d8e018b274fae162e40','p'),('환경위생과',B+'ff8080818b024d8e018b274fb0702e47','p'), ('산림녹지과',B+'ff8080818b024d8e018b274fb19c2e4e','p'),('축산지원과',B+'4028a602975891f70197bfad92b10547','p'), ('건설도시과',B+'ff8080818b024d8e018b274fb2a12e55','p'),('재난안전과',B+'ff8080818b024d8e018b274fb3b62e5c','p'), ('도로교통과',B+'ff8080818b024d8e018b274fb4bf2e63','p'),('하천기반과',B+'ff8080818b024d8e018b274fb5c92e6a','p'), ('건축과',B+'ff8080818b024d8e018b274fb6d92e71','p'), ('보건소','https://www.wanju.go.kr/health/index.9is','s'), ('농업기술센터','https://www.wanju.go.kr/atc/index.9is','s'), ('완주산업단지사무소',B+'ff8080818b024d8e018b274fb8322e7a','p'), ('상하수도사업소',B+'ff8080818b024d8e018b274fb94b2e81','p'), ('도서관사업소',B+'ff8080818b024d8e018b274fba5a2e88','p'), ('완주군 시설관리공단','https://www.wjss.or.kr/index.do','s'), ('완주미래행복센터',B+'ff8080818b024d8e018b274fbb882e8f','p'), ('완주경제센터','http://www.wanju.go.kr/economy','s'), ('완주관광체육마케팅센터',B+'ff8080818b024d8e018b274fbde92e9d','p'), ('완주귀농귀촌지원센터','https://www.wanjuro.org/','s'), ] wb=openpyxl.load_workbook(F); src=wb.active # 710 찾기 (E=실국과/사업소) P=None for r in range(3,src.max_row+1): if src.cell(r,5).value=='실국과/사업소': P=r; break CCOL=6 # F C=src.cell(711,3).value or '전북특별자치도 완주군' ins=len(KIDS)-1 def nr(x): return x+(ins if x>P else 0) MAXC=max(src.max_column,27); MAXR=src.max_row dst=wb.create_sheet('__x__') for col,dim in src.column_dimensions.items(): if dim.width: dst.column_dimensions[col].width=dim.width def cpc(s,dd): dd.value=s.value if s.has_style: dd._style=copy.copy(s._style) dd.number_format=s.number_format def setkid(rw,lab,url,t): dst.cell(rw,3).value=C; dst.cell(rw,CCOL).value=lab; dst.cell(rw,11).value=url if t=='p': dst.cell(rw,12).value='페이지'; dst.cell(rw,13).value=1; dst.cell(rw,14).value='어문'; dst.cell(rw,15).value='미부착' else: dst.cell(rw,12).value='사이트' outr=0 for r in range(1,MAXR+1): outr+=1 for c in range(1,MAXC+1): cpc(src.cell(r,c),dst.cell(outr,c)) dst.row_dimensions[outr].height=src.row_dimensions[r].height or 15 if r==P: # 첫자식을 부모행 F에 lab,url,t=KIDS[0]; setkid(outr,lab,url,t) for (lab,url,t) in KIDS[1:]: outr+=1 for c in range(1,MAXC+1): cpc(src.cell(r,c),dst.cell(outr,c)); dst.cell(outr,c).value=None dst.row_dimensions[outr].height=15; dst.cell(outr,2).value=None setkid(outr,lab,url,t) # merges remap + 새 E병합 for m in src.merged_cells.ranges: a,b,c1,c2=m.min_row,m.max_row,m.min_col,m.max_col na=nr(a) if a>=3 else a nb=(nr(b)+ins) if b==P else (nr(b) if b>=3 else b) dst.merge_cells(start_row=na,start_column=c1,end_row=nb,end_column=c2) # E(실국과/사업소) 병합 신설 dst.merge_cells(start_row=nr(P),start_column=5,end_row=nr(P)+ins,end_column=5) for r in range(3,dst.max_row+1): v=dst.cell(r,11).value if isinstance(v,str) and v.startswith('http'): dst.cell(r,11).hyperlink=v dst.freeze_panes=src.freeze_panes t=src.title; wb.remove(src); dst.title=t; wb.active=wb.index(dst) wb.save(F) print('실국과/사업소 전개: 710=r%d, %d→%d (+%d), 페이지%d·사이트%d'%(P,MAXR,dst.max_row,dst.max_row-MAXR,sum(1 for k in KIDS if k[2]=='p'),sum(1 for k in KIDS if k[2]=='s')))