Initial commit: Excel Address to Postal Code Converter
This commit is contained in:
107
excel_handler.py
Normal file
107
excel_handler.py
Normal 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()
|
||||
Reference in New Issue
Block a user