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 코드에서 넘겨줄 이름을 적어주면 된다.
from docxtpl import DocxTemplate
doc = DocxTemplate('certificates_template.docx')
context = {
'doc_num': '2021-0101',
'name' : '홍길동',
}
doc.render(context)
doc.save('output.docx')
결과는 아래와 같이 의도한 대로 잘 나온다!
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
이름을 |
와 함께 써주면 된다.
{{ 변수명 | 필터명 }}
위 template과 코드를 실행하면 아래 결과와 같이 숫자 값에 천단위 ,
가 추가됨을 확인할 수 있다.
filter 기능을 활용하여 원래 값을 문서 출력 순간에 변환할 수 있는데, 어떻게 활용하면 좋을지는 각자의 몫에 맡기겠다.
Previous post
소스코드 내에(텍스트 파일) vim 옵션 설정하기