공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
55 lines
2.2 KiB
Python
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()
|