DB_JOB/작업파일/_fill_YZAA.py
hehihoho3 df16c98366 백업: DB수집 전체 스냅샷 (공공기관2 정리 전)
공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 18:15:40 +09:00

55 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
"""검수완료 시 엑셀 결과영역 Y/Z/AA 일괄 작성.
사용: python -X utf8 _fill_YZAA.py <엑셀경로> <YYYY-MM-DD> <담당자> [--write]
Y 완료여부(Y,N) = "Y" (모든 데이터 행)
Z 확인 날짜 = 검수일(datetime, yyyy-mm-dd 표시)
AA 수집 담당자 = 담당자(프리랜서1/프리랜서2)
- 데이터 행 판별: B열(순번)이 정수인 행만(3행~). 트레일링 빈행/잡행 제외.
- 인자 없이/--write 없이 실행하면 dry-run(채울 행수만 출력).
- --write 시 백업 *_backup_YZAA전.xlsx 생성 후 기입. 기존 셀 스타일·테두리 보존(값/표시형식만 변경).
"""
import sys
import datetime
import openpyxl
from openpyxl.styles import Alignment
YCOL, ZCOL, AACOL = 25, 26, 27 # Y, Z, AA
def main():
if len(sys.argv) < 4:
print('usage: _fill_YZAA.py <xlsx> <YYYY-MM-DD> <담당자> [--write]')
return
path, dstr, who = sys.argv[1], sys.argv[2], sys.argv[3]
write = '--write' in sys.argv[4:]
y, m, d = (int(x) for x in dstr.split('-'))
dt = datetime.datetime(y, m, d)
wb = openpyxl.load_workbook(path)
ws = wb.active
targets = [r for r in range(3, ws.max_row + 1)
if isinstance(ws.cell(r, 2).value, int)]
if not targets:
print('데이터 행 없음(B열 순번 정수 없음) — 중단'); return
# 이미 채워진 행 수 점검
pre_y = sum(1 for r in targets if ws.cell(r, YCOL).value not in (None, ''))
print('데이터 %d행 | 이미 Y채움 %d행 | 날짜=%s 담당자=%s'
% (len(targets), pre_y, dstr, who))
if not write:
print('(dry-run) --write 추가 시 기입'); return
bak = path.rsplit('.', 1)[0] + '_backup_YZAA전.xlsx'
wb.save(bak)
for r in targets:
cy, cz, ca = ws.cell(r, YCOL), ws.cell(r, ZCOL), ws.cell(r, AACOL)
cy.value, cz.value, ca.value = 'Y', dt, who
cz.number_format = 'yyyy-mm-dd'
for c in (cy, cz, ca):
c.alignment = Alignment(horizontal='center', vertical='center')
wb.save(path)
print('기입 완료: Y/Z/AA %d행 → %s (백업 %s)' % (len(targets), path, bak))
if __name__ == '__main__':
main()