본문 바로가기
카테고리 없음

Excel OpenXML 파일과 Python: workbook.xml과 .rels 파일 파싱 기초

by 퍼포먼스마케팅코더 2024. 1. 16.
반응형

안녕하세요, 오늘은 Python을 사용하여 Excel의 OpenXML 파일 형식을 파싱하는 방법에 대해 알아보겠습니다. 특히, workbook.xml 파일과 관련 파일 .rels을 다루는 방법을 중점적으로 살펴볼 것입니다.

1. workbook.xml 파일 접근 및 파싱

먼저, workbook.xml 파일에 접근하여 파싱하는 과정입니다. 이 파일은 Excel 워크북의 구조와 각 시트에 대한 정보를 담고 있습니다.

import xml.etree.ElementTree as ET

# workbook.xml 파일 경로 설정
workbook_xml_path = "C:/Users/user/Desktop/dsd/dsd_example/xl/workbook.xml"

# 파일 열기 및 파싱
tree = ET.parse(workbook_xml_path)
root = tree.getroot()

 

여기서는 xml.etree.ElementTree 모듈을 사용하여 XML 파일을 파싱하고 있습니다.

2. XML 네임스페이스 정의

XML 파일 내에서 요소를 올바르게 찾기 위해 네임스페이스를 정의합니다.

namespaces = {'main': 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'}

3. 모든 시트의 r:id 값 추출

각 시트의 이름과 r:id 값을 추출하는 과정입니다. r:id는 시트와 연관된 파일 경로를 찾는 데 사용됩니다.

sheets_rid = {}
for sheet in root.findall('main:sheets/main:sheet', namespaces):
    sheet_name = sheet.attrib['name']
    sheet_rid = sheet.attrib.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id')
    sheets_rid[sheet_name] = sheet_rid

4. .rels 파일 파싱

.rels 파일은 각 r:id 값이 어떤 파일을 가리키는지 정의합니다. 이 파일을 파싱하여 각 r:id에 해당하는 경로를 찾습니다.

rels_xml_path = "C:/Users/user/Desktop/dsd/dsd_example/xl/_rels/workbook.xml.rels"

tree_rels = ET.parse(rels_xml_path)
root_rels = tree_rels.getroot()

5. 각 시트의 실제 파일 경로 추출

마지막으로, r:id 값과 .rels 파일을 이용하여 각 시트의 실제 파일 경로를 찾아냅니다.


```python
sheet_paths = {}
for relationship in root_rels.findall("{http://schemas.openxmlformats.org/package/2006/relationships}Relationship"):
    rid = relationship.attrib['Id']
    target = relationship.attrib['Target']
    sheet_paths[rid] = target

for name, rid in sheets_rid.items():
    sheet_path = sheet_paths.get(rid, "경로를 찾을 수 없음")
    print(f"Sheet Name: {name}, r:id: {rid}, Path: {sheet_path}")

 

이 코드는 각 시트의 이름, r:id, 그리고 실제 파일 경로를 매핑하고 출력하는 과정을 보여줍니다. 이를 통해 워크북 내의 각 시트 파일에 접근할 수 있는 경로를 파악할 수 있습니다.

 

이러한 과정을 통해 Python을 활용하여 Excel의 OpenXML 파일 구조를 더 깊이 이해하고, 워크북의 구조를 파악할 수 있습니다. 특히 데이터 분석, 자동화 스크립트 작성 등 다양한 분야에서 이러한 기술이 유용하게 사용될 수 있습니다.

이상으로 Python을 이용한 Excel OpenXML 파일 파싱에 대한 기초적인 내용을 마치겠습니다. 여러분의 프로젝트에 이 정보가 도움이 되길 바랍니다.

 

파이썬 전체 코드

import xml.etree.ElementTree as ET

############# workbook.xml 파일에서 r:id 확인

# workbook.xml 파일 경로 설정 (로컬 환경에 맞게 수정 필요)
workbook_xml_path = "C:/Users/user/Desktop/dsd/dsd_example/xl/workbook.xml"

# workbook.xml 파일 열기 및 파싱
tree = ET.parse(workbook_xml_path)
root = tree.getroot()

# XML 네임스페이스 정의
namespaces = {'main': 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'}

# 모든 시트의 r:id 값 추출
sheets_rid = {}
for sheet in root.findall('main:sheets/main:sheet', namespaces):
    sheet_name = sheet.attrib['name']
    sheet_rid = sheet.attrib.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id')
    sheets_rid[sheet_name] = sheet_rid

# r:id 값 출력
#for name, rid in sheets_rid.items():
#    print(f"Sheet Name: {name}, r:id: {rid}")

############# 관계 파일(.rels) 찾기: r:id 값은 xl/_rels/workbook.xml.rels 파일에 정의된 관계를 참조

# 이어서 .rels 파일 파싱 코드 작성

# .rels 파일 경로 설정 (로컬 환경에 맞게 수정 필요)
rels_xml_path = "C:/Users/user/Desktop/dsd/dsd_example/xl/_rels/workbook.xml.rels"

# .rels 파일 열기 및 파싱
tree_rels = ET.parse(rels_xml_path)
root_rels = tree_rels.getroot()

# 관계 파일에서 각 r:id에 대응하는 Target 속성 추출
sheet_paths = {}
for relationship in root_rels.findall("{http://schemas.openxmlformats.org/package/2006/relationships}Relationship"):
    rid = relationship.attrib['Id']
    target = relationship.attrib['Target']
    sheet_paths[rid] = target

# 각 시트 이름에 대응하는 실제 파일 경로 출력
for name, rid in sheets_rid.items():
    sheet_path = sheet_paths.get(rid, "경로를 찾을 수 없음")
    print(f"Sheet Name: {name}, r:id: {rid}, Path: {sheet_path}")

 

반응형

댓글