TIL | 승강기 처리 데이

Yeseul Han·2024년 9월 11일
0

🌞 시작하는 글

뭔가 심리적으로 일이 많이 밀린듯한 기분..ㅠ
하지만 사실 따지고 보면 열심히 일하고 늘 추가적인 해결을 했다.
내가 다 했다고 생각할 필요도 없지만, 내가 아무것도 안한거 같아 라고 생각하는 버릇은 좋지 않다.
그런 의미에서라도 한 일을 기록할 필요가 있다.

💻 내용

🎯 오늘의 목표
[✔️] 승강기 안전 1번 테이블 처리 - 백그라운드 색 테이블로 처리
[ ] 승강기 마지막 테이블 처리 -
[✔️] 엑셀파일 확인
[ ] 파일 업로드2번

⚗️ 오늘의 실험

이슈 : docx파일 속 테이블에서 각 셀의 백그라운드 색깔 확인 및 춫출이 안됨. 근데 도대체 어느 부분이 백그라운드 색깔이랑 연동이 되는지 모르겠어.

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 태그를 직접 검색하는 기능을 제공하지 않는다.

⭕ Did

[✔️] 백그라운드 색 확인하는 방법
[✔️]

❌ Did Not

profile
코딩 잘하고 싶다

0개의 댓글