DB_JOB/작업파일/공공기관3/완료/6.한국자산관리공사/_expand_orginfo.py
2026-06-26 09:47:44 +09:00

131 lines
4.6 KiB
Python

# -*- coding: utf-8 -*-
import openpyxl, copy, os, shutil
from openpyxl.styles import PatternFill
PATH = r'D:\01.프로젝트\DB수집\작업파일\공공기관3\6.한국자산관리공사\한국자산관리공사.xlsx'
BK = r'D:\01.프로젝트\DB수집\작업파일\공공기관3\6.한국자산관리공사\한국자산관리공사_backup_조직안내탭전개전.xlsx'
SKY = PatternFill('solid', fgColor='FFBDD7EE', bgColor='FFBDD7EE')
NOFILL = PatternFill(fill_type=None)
NC = 27 # AA
mt0 = os.path.getmtime(PATH)
shutil.copy(PATH, BK)
wb = openpyxl.load_workbook(PATH)
ws = wb.active
MAXR = ws.max_row
# merge anchor map for data rows
anchor = {}
for mr in list(ws.merged_cells.ranges):
if mr.min_row >= 3:
for rr in range(mr.min_row, mr.max_row+1):
for cc in range(mr.min_col, mr.max_col+1):
anchor[(rr,cc)] = (mr.min_row, mr.min_col)
def eff(r,c):
a = anchor.get((r,c),(r,c))
return ws.cell(*a).value, copy.copy(ws.cell(*a)._style)
records = []
for r in range(3, MAXR+1):
rec = {'path':[], 'pstyle':[], 'cells':{}, 'cstyle':{}, 'klink':None}
for c in range(4,11): # D..J
v,st = eff(r,c)
rec['path'].append(v); rec['pstyle'].append(st)
for c in [2,3]+list(range(11,NC+1)):
cell = ws.cell(r,c)
rec['cells'][c] = cell.value
rec['cstyle'][c] = copy.copy(cell._style)
if c==11 and cell.hyperlink:
rec['klink'] = cell.hyperlink.target
records.append(rec)
# locate 조직안내 (F, mId=0104020000)
ti = None
for i,rec in enumerate(records):
if rec['path'][2]=='조직안내' and '0104020000' in str(rec['cells'].get(11,'')):
ti = i; break
assert ti is not None, '조직안내 행 못찾음'
base = records[ti]
print('target record idx', ti, 'sheetrow', ti+3, 'path', base['path'][:4])
def mkchild(label, url, Nval):
rec = {'path':[base['path'][0], base['path'][1], '조직안내', label, None, None, None],
'pstyle':[copy.copy(s) for s in base['pstyle']],
'cells':{}, 'cstyle':{}, 'klink':url}
rec['cells'][2]=None
rec['cells'][3]='한국자산관리공사'
rec['cells'][11]=url
rec['cells'][12]='페이지'
rec['cells'][13]=1
rec['cells'][14]=Nval
rec['cells'][15]='미부착'
for c in [16,17]+list(range(18,NC+1)):
rec['cells'][c]=None
for c in [2,3]+list(range(11,NC+1)):
rec['cstyle'][c]=copy.copy(base['cstyle'][c])
return rec
c1 = mkchild('조직안내도', 'https://www.kamco.or.kr/portal/contents.do?mId=0104020100', '어문')
c2 = mkchild('부서·업무내용 및 연락처', 'https://www.kamco.or.kr/portal/contents.do?mId=0104020200', '기타')
c3 = mkchild('운영위원회', 'https://www.kamco.or.kr/portal/contents.do?mId=0104020300', '어문')
records[ti:ti+1] = [c1,c2,c3]
# remove all data merges
for mr in list(ws.merged_cells.ranges):
if mr.min_row >= 3:
ws.unmerge_cells(str(mr))
start = 3
N = len(records)
for idx,rec in enumerate(records):
r = start+idx
for k,c in enumerate(range(4,11)):
cell = ws.cell(r,c); cell.value = rec['path'][k]; cell._style = copy.copy(rec['pstyle'][k])
bcell = ws.cell(r,2); bcell.value = idx+1; bcell._style = copy.copy(rec['cstyle'][2])
for c in [3]+list(range(11,NC+1)):
cell = ws.cell(r,c); cell.value = rec['cells'].get(c); cell._style = copy.copy(rec['cstyle'][c])
kc = ws.cell(r,11); kc.hyperlink = None
kv = rec['cells'].get(11)
if kv and str(kv).startswith('http'):
kc.hyperlink = kv
# clear trailing rows
newmax = start+N-1
if newmax < MAXR:
for r in range(newmax+1, MAXR+1):
for c in range(1, NC+1):
ws.cell(r,c).value = None
ws.cell(r,c).hyperlink = None
# strip cyan + sky-blue on the 3 new rows
for j in range(3):
r = start+ti+j
for c in range(2, NC+1):
ws.cell(r,c).fill = NOFILL
for c in [7,11,12,13,14,15]: # G,K,L,M,N,O
ws.cell(r,c).fill = SKY
ws.cell(start+ti, 6).fill = SKY # F=조직안내 merged anchor
# re-merge path cols D..J by full-prefix equal runs
for c in range(4,11):
i = 0
while i < N:
v = records[i]['path'][c-4]
if v is None or v=='':
i += 1; continue
j = i+1
while j < N:
same = all(records[j]['path'][cc-4]==records[i]['path'][cc-4] for cc in range(4,c+1))
if not same: break
j += 1
if j-i > 1:
ws.merge_cells(start_row=start+i, start_column=c, end_row=start+j-1, end_column=c)
i = j
if os.path.getmtime(PATH) != mt0:
raise SystemExit('ABORT: mtime changed during work')
wb.save(PATH)
print('saved. rows', N, 'maxrow', ws.max_row)