API 만들 때.. 엑셀의 노가다를 자동화해보기 위해 파이썬 기초밖에 모르지만 냅다 지피티에게 도움요청해서 시도해봤는데
이게.. 되네..!
아직 개선의 여지는 있지만 우선 유용하게 사용하고 있다.
코드의 기능
- 사용자로부터 엑셀 파일 경로와 특정 열 이름을 입력받는다. = 매번 달라지는 엑셀 경로와 열 이름을 입력받아 유연하게 처리할 수 있는 구조
- 엑셀 파일 내 모든 시트를 순회하며 각 시트의 데이터를 가공하여 JavaScript 파일로 변환한다.
- 각 시트의 데이터는 'latlng' 좌표, 이름, 거리 정보 등을 포함한 객체로 변환되며, 해당 데이터를 `var pointList = []` 배열 형식으로 저장한다.
- 변환된 데이터는 엑셀 파일 이름과 동일한 하위 디렉토리를 생성하여, 시트 이름을 파일명으로 한 JavaScript 파일로 저장된다.
- 이름 열의 개행이 있는 경우 제거한다.
전체 코드
import os
import pandas as pd
# 사용자 입력 받기
excel_path = input("엑셀 파일 경로를 입력하세요: ") # 엑셀 파일 경로 입력받기
name_column = input("이름이 있는 열 이름을 입력하세요: ") # 이름이 들어 있는 열 이름
distance_column = input("거리 정보가 있는 열 이름을 입력하세요: ") # 거리 정보가 들어 있는 열 이름
# 엑셀 파일명 추출 및 디렉토리 설정
excel_filename = os.path.splitext(os.path.basename(excel_path))[0]
output_dir = os.path.join(os.getcwd(), excel_filename)
# 디렉토리 생성
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 엑셀 파일 전체 시트 순회
excel_file = pd.ExcelFile(excel_path)
for sheet_name in excel_file.sheet_names:
# 각 시트의 데이터 읽기
df = pd.read_excel(excel_path, sheet_name=sheet_name)
# 변환 함수
def create_entry(row):
return f"""
{{
latlng: [{row['latlng']}],
name: '<p class="name">{row[name_column].replace("\\n", "")}</p><p class="distance">{row[distance_column]}</p>',
ico: '../../assets/images/area/location/plot-{row.name + 1}.png'
}}"""
# 모든 데이터 변환
data_list = df.apply(create_entry, axis=1).tolist()
# 개행과 함께 'var pointList = [' 추가
output = "var pointList = [" + ",\n".join(data_list) + "\n];"
# 파일 내보내기 (시트명으로 파일명 지정)
output_path = os.path.join(output_dir, f"{sheet_name}.js")
with open(output_path, 'w', encoding='utf-8') as file:
file.write(output)
print(f"파일 저장 완료: {output_path}")
아래는 지피티의 상세 코드 설명
import os
import pandas as pd
설명:
먼저, 필요한 라이브러리 두 가지를 불러옵니다.
os
: 파일 경로와 디렉토리 작업을 위해 사용합니다.pandas
: 엑셀 파일을 다루고 데이터를 처리하기 위한 강력한 데이터 처리 라이브러리입니다.
# 사용자 입력 받기
excel_path = input("엑셀 파일 경로를 입력하세요: ") # 엑셀 파일 경로 입력받기
name_column = input("이름이 있는 열 이름을 입력하세요: ") # 이름이 들어 있는 열 이름
distance_column = input("거리 정보가 있는 열 이름을 입력하세요: ") # 거리 정보가 들어 있는 열 이름
설명:
- 이 부분에서는 사용자로부터 엑셀 파일의 경로와, 사용할 열(column)의 이름을 입력받습니다.
excel_path
: 엑셀 파일이 저장된 경로를 입력받습니다.name_column
: 엑셀 파일에서 이름 정보가 저장된 열의 이름을 입력받습니다.distance_column
: 엑셀 파일에서 거리 정보가 저장된 열의 이름을 입력받습니다.
이렇게 하면 코드가 여러 파일이나 열 이름을 처리할 수 있는 유연성을 갖게 됩니다.
# 엑셀 파일명 추출 및 디렉토리 설정
excel_filename = os.path.splitext(os.path.basename(excel_path))[0]
output_dir = os.path.join(os.getcwd(), excel_filename)
설명:
excel_filename
: 엑셀 파일 이름에서 확장자(.xlsx)를 제외한 파일명만 추출합니다. 이 이름을 하위 디렉토리 생성에 사용합니다.output_dir
: 현재 작업 중인 디렉토리 안에, 엑셀 파일명과 동일한 이름의 하위 디렉토리를 생성할 경로를 설정합니다.
# 디렉토리 생성
if not os.path.exists(output_dir):
os.makedirs(output_dir)
설명:
- 엑셀 파일명으로 지정된 하위 디렉토리가 존재하지 않으면
os.makedirs()
를 사용해 디렉토리를 생성합니다. 이 디렉토리에 각 시트별로 생성된 JavaScript 파일이 저장됩니다.
# 엑셀 파일 전체 시트 순회
excel_file = pd.ExcelFile(excel_path)
설명:
pd.ExcelFile()
: 엑셀 파일의 모든 시트를 로드합니다. 한 개의 엑셀 파일에는 여러 시트가 있을 수 있기 때문에, 이 부분에서 전체 시트를 읽어와 순회할 준비를 합니다.
for sheet_name in excel_file.sheet_names:
# 각 시트의 데이터 읽기
df = pd.read_excel(excel_path, sheet_name=sheet_name)
설명:
sheet_name
은 엑셀 파일 내에 존재하는 각 시트의 이름을 의미합니다.pd.read_excel()
을 사용해 각 시트를 DataFrame 형식으로 읽습니다. 여기서sheet_name=sheet_name
으로 해당 시트의 데이터를 처리합니다.
# 변환 함수
def create_entry(row):
return f"""
{{
latlng: [{row['latlng']}],
name: '<p class="name">{row[name_column].replace("\\n", "")}</p><p class="distance">{row[distance_column]}</p>',
ico: '../../assets/images/area/location/plot-{row.name + 1}.png'
}}"""
설명:
- 이 함수는 각 행(row)을 받아 JavaScript 객체로 변환하는 함수입니다.
latlng
:row['latlng']
에서 좌표값을 추출합니다.name
: 이름 열(name_column
)에서 값을 추출하고, 여기에 개행 문자가 있을 경우 제거(replace("\\n", "")
)합니다. HTML 태그로 감싸져 있습니다.distance
: 거리 정보 열(distance_column
)에서 값을 가져와<p>
태그로 감쌉니다.ico
: 이미지 경로를 자동으로 생성하여 각 행마다 번호를 붙입니다.row.name + 1
은 각 행 번호를 가져와 이미지 파일명에 반영됩니다.
# 모든 데이터 변환
data_list = df.apply(create_entry, axis=1).tolist()
설명:
df.apply()
는 DataFrame에서 각 행을 받아 변환 작업을 실행하는 함수입니다. 여기서는create_entry()
를 사용하여 모든 행을 처리한 후, 그 결과를 리스트로 변환(tolist()
)합니다.- 결과적으로
data_list
는 각 행에 대한 JavaScript 객체들의 리스트가 됩니다.
# 개행과 함께 'var pointList = [' 추가
output = "var pointList = [" + ",\n".join(data_list) + "\n];"
설명:
var pointList = [
구문을 추가하고, 각 데이터 항목 사이에,
로 구분하여 붙입니다. 각 데이터는 개행되어 보기 좋게 정리됩니다.- 마지막으로
];
로 배열을 닫습니다.
# 파일 내보내기 (시트명으로 파일명 지정)
output_path = os.path.join(output_dir, f"{sheet_name}.js")
with open(output_path, 'w', encoding='utf-8') as file:
file.write(output)
설명:
- 생성한 파일은 디렉토리(
output_dir
) 안에 저장되며, 파일 이름은 시트 이름(sheet_name
)으로 지정됩니다. with open()
구문을 사용해 파일을 쓰기 모드로 열고, 그 안에 변환된 데이터를 기록합니다.
print(f"파일 저장 완료: {output_path}")
설명:
- 파일이 성공적으로 저장되었음을 사용자에게 알리기 위해 저장된 파일 경로를 출력합니다.