공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
137 lines
6.3 KiB
Python
137 lines
6.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
import os, copy
|
|
import openpyxl
|
|
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
|
|
|
|
ROOT = r"D:\01.프로젝트\DB수집"
|
|
TEMPLATE = os.path.join(ROOT, "자료_취합_예시.xlsx")
|
|
BASE = os.path.join(ROOT, "작업파일", "공공기관2")
|
|
os.makedirs(BASE, exist_ok=True)
|
|
|
|
# (새번호, 기관명, 베이스URL, 마스터번호, 부처)
|
|
INSTS = [
|
|
(1, "한국전기안전공사", "https://www.kesco.or.kr/", 277, "기후에너지환경부"),
|
|
(2, "한국전력거래소", "https://www.kpx.or.kr/", 278, "기후에너지환경부"),
|
|
(3, "한국조세재정연구원", "https://www.kipf.re.kr/", 283, "국무조정실"),
|
|
(4, "한국조폐공사", "https://www.komsco.com/", 284, "기획재정부"),
|
|
(5, "한국주택금융공사", "https://www.hf.go.kr/", 285, "금융위원회"),
|
|
(6, "한국중부발전", "https://www.komipo.co.kr/", 286, "기후에너지환경부"),
|
|
(7, "한국지능정보사회진흥원", "https://www.nia.or.kr/", 288, "과학기술정보통신부"),
|
|
(8, "한국지식재산보호원", "https://www.koipa.re.kr/", 289, "특허청"),
|
|
(9, "한국지식재산연구원", "https://www.kiip.re.kr/", 290, "특허청"),
|
|
(10, "한국지역난방공사", "https://www.kdhc.co.kr/", 291, "기후에너지환경부"),
|
|
(11, "한국직업능력연구원", "https://www.krivet.re.kr/", 292, "국무조정실"),
|
|
(12, "한국철도공사", "https://info.korail.com/", 293, "국토교통부"),
|
|
(13, "한국청소년상담복지개발원","https://www.kyci.or.kr/", 294, "여성가족부"),
|
|
(14, "한국청소년정책연구원", "https://www.nypi.re.kr/", 295, "여성가족부"),
|
|
(15, "한국청소년활동진흥원", "https://www.kywa.or.kr/", 296, "여성가족부"),
|
|
(16, "한국체육산업개발", "https://www.ksponco.or.kr/",297, "문화체육관광부"),
|
|
(17, "한국치산기술협회", "https://kafet.or.kr/", 299, "산림청"),
|
|
]
|
|
|
|
# ---- 템플릿 헤더(행1~2) 로드 ----
|
|
tw = openpyxl.load_workbook(TEMPLATE)
|
|
tws = tw.active
|
|
MERGES = ['B1:R1', 'S1:W1', 'Y1:AA1']
|
|
COLW = {}
|
|
for k, v in tws.column_dimensions.items():
|
|
if v.width:
|
|
COLW[k] = v.width
|
|
RH = {1: tws.row_dimensions[1].height, 2: tws.row_dimensions[2].height}
|
|
|
|
def build_inst_xlsx(num, name):
|
|
wb = openpyxl.Workbook()
|
|
ws = wb.active
|
|
ws.title = "%02d_%s" % (num, name)
|
|
for r in (1, 2):
|
|
for c in range(1, 28):
|
|
s = tws.cell(r, c)
|
|
d = ws.cell(r, c)
|
|
d.value = s.value
|
|
if s.has_style:
|
|
d.font = copy.copy(s.font)
|
|
d.fill = copy.copy(s.fill)
|
|
d.border = copy.copy(s.border)
|
|
d.alignment = copy.copy(s.alignment)
|
|
d.number_format = s.number_format
|
|
d.protection = copy.copy(s.protection)
|
|
for m in MERGES:
|
|
ws.merge_cells(m)
|
|
for k, w in COLW.items():
|
|
ws.column_dimensions[k].width = w
|
|
for rr, hh in RH.items():
|
|
if hh:
|
|
ws.row_dimensions[rr].height = hh
|
|
ws.freeze_panes = "A3"
|
|
return wb
|
|
|
|
made = []
|
|
for num, name, url, mnum, dept in INSTS:
|
|
folder = os.path.join(BASE, "%d.%s" % (num, name))
|
|
os.makedirs(folder, exist_ok=True)
|
|
fpath = os.path.join(folder, "%s.xlsx" % name)
|
|
if not os.path.exists(fpath):
|
|
wb = build_inst_xlsx(num, name)
|
|
wb.save(fpath)
|
|
made.append(fpath)
|
|
else:
|
|
made.append(fpath + " (이미있음·skip)")
|
|
|
|
# ---- 현황판 공공기관2_작업현황.xlsx ----
|
|
STATUS = os.path.join(BASE, "공공기관2_작업현황.xlsx")
|
|
thin = Side(style="thin", color="BFBFBF")
|
|
border = Border(left=thin, right=thin, top=thin, bottom=thin)
|
|
hdr_fill = PatternFill("solid", fgColor="D9E1F2")
|
|
hdr_font = Font(bold=True, size=10)
|
|
center = Alignment(horizontal="center", vertical="center")
|
|
left = Alignment(horizontal="left", vertical="center")
|
|
|
|
swb = openpyxl.Workbook()
|
|
sh = swb.active
|
|
sh.title = "현황"
|
|
cols = ["구분","번호","기관","담당자","상태","검수","행수","검수완료일","제출완료","제출일","비고","홈페이지"]
|
|
for c, h in enumerate(cols, 1):
|
|
cell = sh.cell(1, c, h)
|
|
cell.fill = hdr_fill; cell.font = hdr_font; cell.alignment = center; cell.border = border
|
|
for i, (num, name, url, mnum, dept) in enumerate(INSTS, start=2):
|
|
row = ["공공기관", num, name, "프리랜서2", "미수집", "미검수", "", "", "", "",
|
|
"마스터번호 %d / %s" % (mnum, dept), url]
|
|
for c, val in enumerate(row, 1):
|
|
cell = sh.cell(i, c, val)
|
|
cell.border = border
|
|
cell.alignment = left if c in (3, 11, 12) else center
|
|
if c == 12 and val:
|
|
cell.hyperlink = val
|
|
cell.font = Font(color="0000FF", underline="single", size=10)
|
|
widths = {"A":9,"B":6,"C":24,"D":10,"E":10,"F":8,"G":7,"H":12,"I":9,"J":11,"K":26,"L":30}
|
|
for k, w in widths.items():
|
|
sh.column_dimensions[k].width = w
|
|
sh.freeze_panes = "A2"
|
|
|
|
# 요약 시트
|
|
su = swb.create_sheet("요약")
|
|
last = 1 + len(INSTS) # 18
|
|
su["A1"] = "◆ 담당자별"; su["A1"].font = Font(bold=True)
|
|
hdr = ["담당자","기관수","검수완료","미검수","제출완료","총 행수"]
|
|
for c, h in enumerate(hdr, 1):
|
|
cell = su.cell(2, c, h); cell.font = hdr_font; cell.fill = hdr_fill; cell.alignment = center; cell.border = border
|
|
su["A3"] = "프리랜서2"
|
|
su["B3"] = '=COUNTIF(현황!$D$2:$D$%d,A3)' % last
|
|
su["C3"] = '=COUNTIFS(현황!$D$2:$D$%d,A3,현황!$F$2:$F$%d,"완료")' % (last, last)
|
|
su["D3"] = '=COUNTIFS(현황!$D$2:$D$%d,A3,현황!$F$2:$F$%d,"미검수")' % (last, last)
|
|
su["E3"] = '=COUNTIFS(현황!$D$2:$D$%d,A3,현황!$I$2:$I$%d,"완료")' % (last, last)
|
|
su["F3"] = '=SUMIFS(현황!$G$2:$G$%d,현황!$D$2:$D$%d,A3)' % (last, last)
|
|
su["A5"] = "◆ 전체"; su["A5"].font = Font(bold=True)
|
|
su["A6"] = "기관수"; su["B6"] = '=COUNTA(현황!$B$2:$B$%d)' % last
|
|
su["A7"] = "검수완료"; su["B7"] = '=COUNTIF(현황!$F$2:$F$%d,"완료")' % last
|
|
su["A8"] = "총 행수"; su["B8"] = '=SUM(현황!$G$2:$G$%d)' % last
|
|
for k, w in {"A":12,"B":12,"C":10,"D":8,"E":10,"F":10}.items():
|
|
su.column_dimensions[k].width = w
|
|
swb.save(STATUS)
|
|
|
|
print("=== 생성 완료 ===")
|
|
print("폴더/엑셀:", len(made))
|
|
for m in made:
|
|
print(" ", os.path.relpath(m, ROOT))
|
|
print("현황판:", os.path.relpath(STATUS, ROOT))
|