Heesung Yang

[Python] MS Word 파일 수정하기

python 코드로 MS Word 문서를 편집할 때 사용할 수 있는 라이브러리를 소개하고자 한다.

python-docx은 코드로 직접 문서를 작성하는데 초점이 맞춰져 있는 반면, docxtpl은 이미 만들어져 있는 문서를 읽어와서 필요한 부분만 변경하는 것에 초점이 맞춰져 있다. 필자는 DB 데이터를 MS Word 문서로 생성해야 할 필요가 있었고, 이 경우 문서를 직접 코드로 작성하는 python-docx보다는 MS Word로 작성한 template 에서 필요한 부분만 바꿀 수 있는 docxtpl 라이브러리를 사용하는 편이 훨씬 효율적이었다.

(참고로 docxtpl 라이브러리 내부에서 python-docx를 사용한다.)

docxtpl

우선 라이브러리부터 설치하자.

~$ pip install docxtpl

아래와 같은 MS Word 문서 양식이 있다. 해당 문서에서 {{ doc_num }}{{ name }} 이라고 되어 있는 부분이 치환할 부분이다. 치환하고 싶은 부분을 {{ }} 로 감싼 뒤 괄호 안에 python 코드에서 넘겨줄 이름을 적어주면 된다.

certificates_template

from docxtpl import DocxTemplate

doc = DocxTemplate('certificates_template.docx')

context = {
    'doc_num': '2021-0101',
    'name' : '홍길동',
}

doc.render(context)
doc.save('output.docx')

결과는 아래와 같이 의도한 대로 잘 나온다!

certificates_output

template filter 사용하기

추가로 docxtpl 사용 시 활용할 수 있는 filter 기능에 대해 알아보겠다. filter란 python 코드에서 넘어온 값을 문서에 렌더링 하기 전에 변환하는 기능인데 template 문서에서 간단하게 활용할 수 있다.

여기서는 숫자값에 천단위 comma를 추가하는 filter를 작성해보자.

import jinja2
from docxtpl import DocxTemplate

def comma(value):
    # python3 의 format 함수를 이용.
    return "{:,}".format(value)

jinja_env = jinja2.Environment()
jinja_env.filters['c'] = comma   # filter 이름을 c 라고 붙였다.


doc = DocxTemplate('certificates_template.docx')

context = {
    'doc_num': '2021-0101',
    'name' : '홍길동',
    'cost' : 1000000,
}

doc.render(context, jinja_env)
doc.save('output.docx')

MS Word 문서 template 에서는 아래와 같이 위에서 작성한 filter 이름을 | 와 함께 써주면 된다.

{{ 변수명 | 필터명 }}

certificates_filter_template

위 template과 코드를 실행하면 아래 결과와 같이 숫자 값에 천단위 , 가 추가됨을 확인할 수 있다.

certificates_filter

filter 기능을 활용하여 원래 값을 문서 출력 순간에 변환할 수 있는데, 어떻게 활용하면 좋을지는 각자의 몫에 맡기겠다.