1. 개요
현대 IT 환경에서 데이터는 다양한 형식으로 존재합니다. JSON, XML, OData 등 여러 형태로 API 응답이 오는데, 이를 분석하거나 보고서로 만들 때 가장 보편적으로 사용하는 도구가 바로 Excel입니다. 물론 온라인 변환기 사이트가 많이 있지만, 광고와 하루 횟수 제한으로 인해 굉장히 불편한 것이 현실입니다. 그래서 이런 제약 없이 자유롭게 사용할 수 있는 '엑셀 헬퍼'를 만들게 되었습니다.
- JSON, XML, OData(v2/v4) 데이터를 엑셀 형식으로 변환
- 데이터에서 자동으로 헤더 추출
- 사용자 정의 헤더 지원
- 스타일이 적용된 깔끔한 엑셀 파일 생성
2. create_excel_ex: 엑셀 예제 파일 생성
create_excel_ex.py는 헤더와 데이터를 받아 스타일이 적용된 엑셀 파일을 생성합니다.
def create_excel_with_headers(title, headers, data_rows=None, parent=None):
# 파일 저장 경로 선택
download_folder = os.path.expanduser("~/Downloads")
timestamp = datetime.now().strftime("%Y%m%d")
default_filename = f"{title}_{timestamp}.xlsx"
filepath = filedialog.asksaveasfilename(
initialdir=download_folder,
initialfile=default_filename,
defaultextension=".xlsx",
filetypes=[("Excel 파일", "*.xlsx"), ("모든 파일", "*.*")]
)
if not filepath:
return None # 사용자가 취소함
# 엑셀 파일 생성
success = generate_excel(filepath, title, headers, data_rows)
if success:
messagebox.showinfo("성공", f"엑셀 파일이 생성되었습니다.\n{filepath}")
return filepath
return None
이 모듈은 다음과 같은 특징을 가집니다:
- 파일명에 타임스탬프를 추가하여 중복 방지
- 사용자 친화적인 파일 저장 대화상자
- 자동으로 헤더 스타일링 (굵은 글씨, 중앙 정렬, 배경색)
- 테두리와 필터 자동 적용
- 열 너비 자동 조정
3. convert_json_excel: JSON
JSON은 현대 API의 표준 응답 형식입니다. convert_json_excel.py 모듈은 이러한 JSON 데이터를 엑셀 형식으로 변환해줍니다.
def parse_json_text(json_text):
"""JSON 텍스트 파싱"""
try:
json_data = json.loads(json_text)
# 배열이 아닌 경우 배열로 변환
if not isinstance(json_data, list):
json_data = [json_data]
return json_data, None
except json.JSONDecodeError:
return None, "유효한 JSON 형식이 아닙니다."
except Exception as e:
return None, f"오류: {str(e)}"
이 모듈의 주요 기능은:
- 단일 객체와 배열 모두 처리 가능
- 자동으로 JSON 객체에서 키를 추출하여 헤더로 사용
- 중첩된 객체나 배열도 문자열로 변환하여 처리
작동 방식을 간단히 설명하자면:
- JSON 텍스트를 파싱하여 Python 객체로 변환
- 첫 번째 객체에서 키를 추출하여 헤더로 사용
- 각 객체의 값을 행 데이터로 변환 (중첩 구조는 문자열화)
4. convert_odata4_excel: OData v4
OData는 RESTful API를 위한 프로토콜로, 특히 SAP 시스템에서 많이 사용됩니다. convert_odata4_excel.py는 OData v4 응답을 처리합니다.
def parse_odata4_text(odata_text):
"""OData 4.0 응답 텍스트 파싱"""
try:
odata_data = json.loads(odata_text)
# OData v4 응답 구조 확인
if not isinstance(odata_data, dict):
return None, "OData 응답은 객체 형태여야 합니다."
# 데이터 항목 추출 - OData v4는 보통 value 속성에 데이터 배열이 있음
if "value" in odata_data and isinstance(odata_data["value"], list):
return odata_data["value"], None
# value 속성이 없는 경우 (단일 엔터티 응답일 수 있음)
if "value" not in odata_data:
# 단일 엔터티는 배열로 변환
return [odata_data], None
return None, "OData 응답에서 데이터를 찾을 수 없습니다."
except json.JSONDecodeError:
return None, "유효한 JSON 형식이 아닙니다."
except Exception as e:
return None, f"오류: {str(e)}"
이 모듈의 주요 특징:
- OData v4 응답 구조(value 배열) 자동 인식
- @odata. 접두사가 있는 메타데이터 필드 자동 제외
- 단일 엔터티와 컬렉션 응답 모두 처리
5. convert_xml_excel: XML
XML은 여전히 많은 시스템에서 사용되는 데이터 형식입니다. convert_xml_excel.py는 XML 데이터를 엑셀 형식으로 변환합니다.
def find_repeating_elements(root):
"""XML에서 반복되는 요소 찾기"""
# 첫 번째 수준의 자식 요소 가져오기
child_elements = list(root)
if not child_elements:
return None, "XML에 자식 요소가 없습니다."
# 가장 많이 반복되는 태그 이름 찾기
tag_counts = {}
for child in child_elements:
tag = child.tag
tag_counts[tag] = tag_counts.get(tag, 0) + 1
# 가장 많이 반복되는 태그 찾기
most_common_tag = max(tag_counts.items(), key=lambda x: x[1])[0]
# 반복되는 요소들 찾기
repeated_elements = [elem for elem in child_elements if elem.tag == most_common_tag]
if not repeated_elements:
return None, "XML에서 반복되는 요소를 찾을 수 없습니다."
return repeated_elements, None
이 모듈의 특별한 점:
- 자동으로 XML에서 반복되는 요소 패턴 감지
- 반복 요소의 자식 태그를 헤더로 사용
- 구조적 데이터를 평면화하여 엑셀 형식으로 변환
작동 방식:
- XML 문서 파싱
- 가장 많이 반복되는 요소 패턴 식별
- 첫 번째 반복 요소의 자식 태그를 헤더로 추출
- 각 반복 요소의 내용을 행 데이터로 변환
6. 실 사용 사례
필자는 IT 서비스 회사의 인프라 운영 부서에서 일하고 있습니다. 서버, 네트워크, 스토리지 등 다양한 시스템을 관리하며 수많은 데이터와 씨름하고 있죠. 엑셀 헬퍼는 이런 환경에서 탄생했습니다.
데이터 추출 문의 처리의 효율화
"서버 목록을 엑셀로 주세요", "네트워크 장비 현황을 정리해주세요" - 이런 요청이 하루에도 몇 번씩 옵니다. 과거에는:
- API에서 JSON 데이터 추출
- 데이터 구조 분석
- 엑셀에 복사하여 붙여넣기
- 데이터 정리 및 서식 적용
이 과정에 30분에서 1시간까지 소요되었습니다. 엑셀 헬퍼 도입 후에는 API 응답을 복사해 붙여넣고 작업 시간이 5분 이내로 단축되었습니다.
단순한 유틸리티가 일상 업무에 가져온 변화는 생각보다 큽니다. 반복적인 데이터 변환 작업에서 해방되어 더 가치 있는 일에 집중할 수 있게 되었으니까요. 여러분의 업무에도 이런 작은 자동화가 큰 변화를 가져올 수 있기를 바랍니다!
'Python' 카테고리의 다른 글
YouTube 음악을 MP3로 다운로드하는 프로그램 만들기 (0) | 2025.03.22 |
---|---|
Python을 활용한 업무 자동화 예제 [폴더 정리 기능] (1) | 2025.03.18 |
[Python] Selenium 사용법 정리 (0) | 2023.09.18 |
Pandas IO File Format (0) | 2022.03.27 |
Pandas map, apply 예제 (0) | 2022.02.16 |