공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
1.9 KiB
Python
51 lines
1.9 KiB
Python
import sys, io
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
|
import openpyxl
|
|
from openpyxl.utils import get_column_letter
|
|
ws = openpyxl.load_workbook(r'D:\01.프로젝트\DB수집\작업파일\_제출패키지_2026-06-03\프리랜서1\충청남도_부여군.xlsx').active
|
|
merges=list(ws.merged_cells.ranges)
|
|
def merge_of(r,c):
|
|
for m in merges:
|
|
if m.min_row<=r<=m.max_row and m.min_col<=c<=m.max_col: return m
|
|
return None
|
|
def raw(r,c): return ws.cell(r,c).value
|
|
def eff(r,c):
|
|
m=merge_of(r,c)
|
|
return ws.cell(m.min_row,m.min_col).value if m else raw(r,c)
|
|
data=[r for r in range(3,ws.max_row+1) if ws.cell(r,2).value not in (None,'')]
|
|
dset=set(data)
|
|
|
|
print('=== 480~572 행 카테고리 + 병합상태 (D/E/F/G/H) ===')
|
|
def tag(r,c):
|
|
m=merge_of(r,c)
|
|
return f'<{m.min_row}:{m.max_row}>' if m else ''
|
|
for r in range(480, 573):
|
|
if r not in dset:
|
|
print(f'r{r} (B빈)'); continue
|
|
parts=[]
|
|
for c,nm in [(4,'D'),(5,'E'),(6,'F'),(7,'G'),(8,'H')]:
|
|
v=raw(r,c)
|
|
if v not in (None,'') or tag(r,c):
|
|
parts.append(f'{nm}={v!r}{tag(r,c)}')
|
|
print(f'r{r} ' + ' '.join(parts))
|
|
|
|
# (b) adjacent same-value cells NOT in the same merge (duplicated value -> should be merged)
|
|
print('\n=== 인접 같은값인데 병합 안 된 셀 (중복값형 미병합) D/E/F/G ===')
|
|
for c in (4,5,6,7):
|
|
col=get_column_letter(c)
|
|
hits=[]
|
|
for i in range(len(data)-1):
|
|
r1,r2=data[i],data[i+1]
|
|
if r2!=r1+1: continue
|
|
v1,v2=raw(r1,c),raw(r2,c)
|
|
if v1 not in (None,'') and v1==v2:
|
|
m1,m2=merge_of(r1,c),merge_of(r2,c)
|
|
if not (m1 and m2 and m1==m2):
|
|
# same parent?
|
|
if tuple(eff(r1,cc) for cc in range(4,c))==tuple(eff(r2,cc) for cc in range(4,c)):
|
|
hits.append((r1,r2,v1))
|
|
if hits:
|
|
print(f' {col}: {len(hits)}건', [(a,b,v) for a,b,v in hits][:20])
|
|
else:
|
|
print(f' {col}: 없음')
|