Initial commit: Excel Address to Postal Code Converter

This commit is contained in:
2026-05-26 22:38:52 +09:00
commit b91d8b8fac
8 changed files with 542 additions and 0 deletions

107
excel_handler.py Normal file
View File

@@ -0,0 +1,107 @@
from openpyxl import load_workbook
from config import ADDRESS_COLUMN, POSTAL_CODE_COLUMN
class ExcelHandler:
"""엑셀 파일에서 주소를 읽고 우편번호를 추가"""
def __init__(self, file_path):
"""
Args:
file_path (str): 엑셀 파일 경로
"""
self.file_path = file_path
self.workbook = None
self.worksheet = None
def open_file(self):
"""엑셀 파일을 엽니다"""
try:
self.workbook = load_workbook(self.file_path)
self.worksheet = self.workbook.active
print(f"✓ 파일 열기 성공: {self.file_path}")
return True
except FileNotFoundError:
print(f"✗ 파일을 찾을 수 없습니다: {self.file_path}")
return False
except Exception as e:
print(f"✗ 파일 열기 실패: {str(e)}")
return False
def get_column_index(self, column_name):
"""컬럼 이름으로부터 컬럼 인덱스를 찾습니다"""
for cell in self.worksheet[1]:
if cell.value == column_name:
return cell.column
return None
def get_addresses(self):
"""엑셀에서 주소 컬럼을 읽어서 주소 리스트를 반환합니다"""
address_col = self.get_column_index(ADDRESS_COLUMN)
if address_col is None:
print(f"'{ADDRESS_COLUMN}' 컬럼을 찾을 수 없습니다")
return None
addresses = []
for row in range(2, self.worksheet.max_row + 1):
cell_value = self.worksheet.cell(row, address_col).value
if cell_value:
addresses.append(str(cell_value).strip())
print(f"{len(addresses)}개의 주소를 읽었습니다")
return addresses
def add_postal_codes(self, postal_code_dict):
"""
우편번호 딕셔너리를 엑셀에 추가합니다.
Args:
postal_code_dict (dict): {주소: 우편번호} 형태의 딕셔너리
"""
# "우편번호" 컬럼이 없으면 추가
postal_col = self.get_column_index(POSTAL_CODE_COLUMN)
if postal_col is None:
postal_col = self.worksheet.max_column + 1
self.worksheet.cell(1, postal_col).value = POSTAL_CODE_COLUMN
print(f"'{POSTAL_CODE_COLUMN}' 컬럼 추가됨 (컬럼 {postal_col})")
address_col = self.get_column_index(ADDRESS_COLUMN)
if address_col is None:
print(f"'{ADDRESS_COLUMN}' 컬럼을 찾을 수 없습니다")
return False
# 주소와 매칭하여 우편번호 입력
updated_count = 0
for row in range(2, self.worksheet.max_row + 1):
address = self.worksheet.cell(row, address_col).value
if address:
address_str = str(address).strip()
if address_str in postal_code_dict:
postal_code = postal_code_dict[address_str]
self.worksheet.cell(row, postal_col).value = postal_code
updated_count += 1
print(f"{updated_count}개 행의 우편번호가 추가되었습니다")
return True
def save_file(self, output_path=None):
"""
엑셀 파일을 저장합니다.
Args:
output_path (str): 저장할 파일 경로 (None이면 원본 파일 덮어쓰기)
"""
try:
save_path = output_path or self.file_path
self.workbook.save(save_path)
print(f"✓ 파일 저장 완료: {save_path}")
return True
except Exception as e:
print(f"✗ 파일 저장 실패: {str(e)}")
return False
def close_file(self):
"""파일을 닫습니다"""
if self.workbook:
self.workbook.close()