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

(엔지니어를 위한) 파이썬 시작하기[17]

by 돌종 2023. 2. 14.

(엔지니어를 위한) 파이썬 시작하기[17]

 

내용 : xlwings 출력 양식 기능 모음

참조 :

xlwings 공식 홈페이지 : https://www.xlwings.org/

 

 

0.시작하며

python으로 엑셀을 통제할 수 있는 모듈들은 많다. 모듈마다 특성이 좀 다르다. openpyxl의 경우 컴퓨터에 엑셀이 깔려있지 않아도 동작한다. 엑셀파일을 읽고 쓸 수 있다. 그래서 웹환경(웹서버)에서도 python으로 엑셀 파일을 만들 수 있다. xlwings는 엑셀이 설치되어 있어야 한다. xlwings는 엑셀 프로그램과 연동하는 형태다. 그래서 엑셀이 지원하는 다양한 기능들을 사용할 수 있다. 오늘 살펴볼 기능들은 xlwings로 셀 병합하기, 폰트 및 폰트크기 설정하기, 선그리기, 셀 색상 채우기 등이다.

 

1. 셀병합 (merge)

국내 엔지니어링 업계에서 엑셀을 계산서 작성용으로 많이 쓴다. 엑셀은 셀단위로 수식을 입력하게 되어있어서 컬럼이 모두 일률적이어야 한다. 하지만 문서를 작성하다보면 컬럼을 모두 일률적으로 맞출 수는 없다. 그래서 컬럼 폭을 줄이고 셀을 merge해서 쓰는 방법을 찾아냈다. 필자는 개인적으로 이 방법을 좋아하지는 않는다. 셀들을 복사나 변경을 하려면 병합 되어있는 셀들이 말썽을 부리기 때문이다. 아래의 코드는 C4:E4의 세개 셀을 병합하는 코드다.

import xlwings as xw
wsout = xw.sheets.active
wsout.range((4,3), (4, 5)).merge()

 

 

 

range(“C4:E4”)라고 해도 결과는 같다. 하지만 병합할 곳들이 많다면 셀 주소를 변수로 처리해서 반복문을 돌려야 할 때도 있을 것이다. 행과 열을 숫자로 표현하는 것이 편할 것이다. 그런 경우에는 이런 식으로 range를 정해줄 수 있다. range((r,c),(r,c))앞의 (r,c)가 시작셀, 뒤의 (r,c)가 끝 셀을 뜻한다.

 

2. 텍스트 스타일 및 크기 설정

텍스트 폰트를 선택할 때는 range를 선택하고 font.name을 정해주면 된다. 크기는 font.size로 설정할 수 있다. A1:Z200 범위를 모두 굴림체의 9 point로 설정하고 A2는 볼드와 붉은 색을 적용했다.

wsout.range("A1:Z200").font.name = "굴림체"
wsout.range("A1:Z200").font.size = 9
wsout.range("A2").font.bold = True
wsout.range("A2").font.color = (255,0,0)
 

 

텍스트의 일부분에만 bold, 색상 등을 적용하려면 characters 속성을 이용해서 원하는 글자들을 선택할 수 있다. 아래 코드는 “단면제원”만 붉은 색으로 변경하는 코드다.

 
wsout.range("B2").characters[3:7].font.color = (255,0,0)

 

3. 텍스트 정렬.

텍스트 정렬방법을 정해줄 때는 range를 선택하고 .api.HorizontalAlignment = -4131과 같이 써주면 된다. -4131은 왼쪽 정렬을 뜻한다.

 
wsout.range("C4:E4").api.HorizontalAlignment = -4131

● Center-aligned : -4108

● Right-aligned : -4152

● Left-aligned : -4131

 

위는 C4:E4를 가운데 정렬로 처리한 결과다. 그렇다면 병합된 셀들을 C4:E4로 꼭 지정해줘야 할까? 아니면 C4만 지정해주면 될까? 병합된 C4:E4중 C4에만 왼쪽 정렬을 적용해보자. 왼쪽 정렬이 잘 적용된다. D4나 D5를 지정해도 병합된 셀에 왼쪽정렬이 잘 적용된다.

wsout.range("C4").api.HorizontalAlignment = -4131
 

 

그런데 가운데 정렬은 -4108이라는 숫자를 외우기 불편하다. 그래서 xlwings에서는 constants.py에 상수들을 정의해놨다.

URL https://github.com/xlwings/xlwings/blob/main/xlwings/constants.py에 접속해보면 상수들이 정의되어 있는 것을 확인할수 있다. 여기서 -4108을 검색해보자. 아래와 같이 지정되어있는 것을 확인할 수 있다. 이제 -4108 대신 xlCenter라고 쓰면 된다. 대신 이 상수를 쓰려면 앞에 xw.constants.Constants.xlCenter와 같이 xw.constants.Constants를 붙여 줘야 한다.

 

wsout.range("C4").api.HorizontalAlignment = xw.constants.Constants.xlCenter
 

 

4. 테두리 그리기(border)

엑셀을 쓰는 이유 중 하나가 테두리 그리기가 쉽다는 것이다. 앞에서 언급했듯이 셀병합을 하고 테두리를 그리면 원하는 테이블을 만들 수 있다. 테두리는 아래와 같이 range를 선택하고 위치를 지정하고 두께를 주는 방식으로 그린다. range.api.Borders(위치) = 두께

constants.py에는 아래와 같이 정의 되어있다. 선두께는 1,-4138,4,2를 쓸 수 있는고 역시 constants.py에 쉽게 기억할 수 있게 정의 되어있다.

 
class BordersIndex:
	xlDiagonalDown = 5 # from enum XlBordersIndex
	xlDiagonalUp = 6 # from enum XlBordersIndex
	xlEdgeBottom = 9 # from enum XlBordersIndex
	xlEdgeLeft = 7 # from enum XlBordersIndex
	xlEdgeRight = 10 # from enum XlBordersIndex
	xlEdgeTop = 8 # from enum XlBordersIndex
	xlInsideHorizontal = 12 # from enum XlBordersIndex
	xlInsideVertical = 11 # from enum XlBordersIndex

class BorderWeight:
	xlHairline = 1 # from enum XlBorderWeight
	xlMedium = -4138 # from enum XlBorderWeight
	xlThick = 4 # from enum XlBorderWeight
	xlThin = 2 # from enum XlBorderWeight

아래는 C4:X5 영역을 선택해서 바깥쪽 선은 두꺼운 4, 안쪽 선은 얇은 2로 설정해서 테두리를 그리는 코드다. bordertop 등의 변수는 코드가 너무 길어지는 것을 막기 위해 정의한 것이다.

 
bordertop = xw.constants.BordersIndex.xlEdgeTop
borderbottom = xw.constants.BordersIndex.xlEdgeBottom
borderleft = xw.constants.BordersIndex.xlEdgeLeft
borderright = xw.constants.BordersIndex.xlEdgeRight
borderinsideH = xw.constants.BordersIndex.xlInsideHorizontal
borderinsideV = xw.constants.BordersIndex.xlInsideVertical
wsout.range("C4:X5").api.Borders(bordertop).Weight = 4
wsout.range("C4:X5").api.Borders(borderbottom).Weight = 4
wsout.range("C4:X5").api.Borders(borderleft).Weight = 4
wsout.range("C4:X5").api.Borders(borderright).Weight = 4 wsout.range("C4:X5").api.Borders(borderinsideH).Weight = 2 wsout.range("C4:X5").api.Borders(borderinsideV).Weight = 2

5. 셀 색 채우기

셀을 채우려면 아래와 같이 range를 선택하고 color를 지정해준다. color는 (R,G,B)로 표현한다. 하늘색(cyan)은 (0,255,255), 노란색은 (255,255,0)이다. RGB color로 검색하면 원하는 색의 RGB값을 쉽게 알 수 있다.

 
wsout.range("C4:X4").color = (0,255,255)

 

-끝-