공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
import sys, io
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
|
import openpyxl
|
|
from openpyxl.utils import get_column_letter
|
|
PKG = r'D:\01.프로젝트\DB수집\작업파일\_제출패키지_2026-06-03\프리랜서1\충청남도_부여군.xlsx'
|
|
ws = openpyxl.load_workbook(PKG).active
|
|
|
|
# which columns are ever part of a merge (rows>=3)
|
|
mergecols=set()
|
|
for m in ws.merged_cells.ranges:
|
|
if m.min_row>=3:
|
|
for c in range(m.min_col,m.max_col+1): mergecols.add(c)
|
|
print('merged columns (>=3):', sorted(get_column_letter(c) for c in mergecols))
|
|
|
|
def anyb(cell):
|
|
b=cell.border
|
|
return any([b.left.style,b.right.style,b.top.style,b.bottom.style])
|
|
|
|
# cells in merge (interior or anchor)
|
|
def in_merge(r,c):
|
|
for m in ws.merged_cells.ranges:
|
|
if m.min_row<=r<=m.max_row and m.min_col<=c<=m.max_col:
|
|
return True
|
|
return False
|
|
|
|
print('\n=== per-column: rows(3-572) NOT in merge AND no border ===')
|
|
for c in range(2,28):
|
|
miss=[r for r in range(3,ws.max_row+1) if not in_merge(r,c) and not anyb(ws.cell(r,c))]
|
|
if miss:
|
|
print(f' col {get_column_letter(c)}: {len(miss)} rows e.g. {miss[:6]}')
|
|
|
|
# row 233 per-column border presence (reference)
|
|
print('\n=== row 233 reference border (style on each side) ===')
|
|
for c in range(2,28):
|
|
cell=ws.cell(233,c); b=cell.border
|
|
print(f' {get_column_letter(c)}: L={b.left.style} R={b.right.style} T={b.top.style} B={b.bottom.style}')
|