뭔가 심리적으로 일이 많이 밀린듯한 기분..ㅠ
하지만 사실 따지고 보면 열심히 일하고 늘 추가적인 해결을 했다.
내가 다 했다고 생각할 필요도 없지만, 내가 아무것도 안한거 같아 라고 생각하는 버릇은 좋지 않다.
그런 의미에서라도 한 일을 기록할 필요가 있다.
🎯 오늘의 목표
[✔️] 승강기 안전 1번 테이블 처리 - 백그라운드 색 테이블로 처리
[ ] 승강기 마지막 테이블 처리 -
[✔️] 엑셀파일 확인
[ ] 파일 업로드2번
1) Xml 출력
import docx
# DOCX 파일 열기
doc_path = "your_document_path.docx" # DOCX 파일 경로
doc = docx.Document(doc_path)
# 테이블을 순회하며 셀의 XML을 출력하는 함수
def print_cell_xml():
for table_index, table in enumerate(doc.tables):
print(f"Table {table_index + 1}:")
for row_index, row in enumerate(table.rows):
for cell_index, cell in enumerate(row.cells):
cell_xml = cell._element.xml # 셀의 XML을 문자열로 가져옴
print(f"Row {row_index + 1}, Cell {cell_index + 1}:")
print(cell_xml) # 셀의 XML 구조 출력
print_cell_xml()
2) 출력된 xml 에서 색깔이 있는 cell을 찾고 그 부분의 코드를 확인하면서 백그라운드 색과 관련 있어 보이는 코드를 확인.
<w:shd w:fill="dce6f0"/>
#dcebf0
은 미색의 하늘색으로 실제 파일에서 보이는 셀의 색깔과 일치한다.
이를 통해 <w:shd w:fill="..."/> 코드가 연관 있다는걸 알 수 있다.
3) 위를 이용해 코드를 생성
from docx.oxml.ns import qn
def has_background_color(cell):
"""
주어진 셀이 백그라운드 색을 가지고 있는지 확인합니다.
:param cell: DOCX 테이블의 셀
:return: 백그라운드 색이 있으면 True, 없으면 False
"""
cell_xml = cell._element # 셀의 XML 요소에 접근
shd = cell_xml.find(qn('w:shd')) # 'w:shd' 태그를 찾음
if shd is not None:
fill = shd.get(qn('w:fill')) # 'w:fill' 속성을 확인
if fill and fill != "auto": # 'auto'가 아닌 값이 있으면 배경색이 설정된 것
print(f"Background color detected: {fill}") # 배경색 출력 (디버깅용)
return True
return False
근데 결과가 출력이 잘 안된다. shd를 프린트해봤더니 모두 None이 나온다.
4) xml 라이브러리를 사용해서 네임스페이스를 정확히 지정하고 확인해보았다.
from lxml import etree
def has_background_color(cell):
"""
주어진 셀이 백그라운드 색을 가지고 있는지 확인합니다.
:param cell: DOCX 테이블의 셀
:return: 백그라운드 색이 있으면 True, 없으면 False
"""
cell_xml = cell._element # 셀의 XML 요소에 접근
shd = cell_xml.find('.//w:shd', namespaces={'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}) # 네임스페이스를 포함하여 'w:shd' 태그 찾기
if shd is not None:
fill = shd.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}fill') # 'fill' 속성 확인
if fill and fill != "auto": # 'auto'가 아닌 값이 있으면 배경색이 설정된 것
print(f"Background color detected: {fill}") # 배경색 출력 (디버깅용)
return True
return False
=> 결과 잘됨.
=> 네임스페이스의 차이... xml 태그에서 'w'라는 접두어는 실제로는 http://schemas.openxmlformats.org/wordprocessingml/2006/main
라는 url을 표현한 것으로 이 url을 포함해서 찾아야만 xml 내에서 정확하게 찾을수 있다.
=> 참고로 python-docx 라이브러리는 네임스페이스를 명시적으로 지정해 XML 태그를 직접 검색하는 기능을 제공하지 않는다.
[✔️] 백그라운드 색 확인하는 방법
[✔️]