본문 바로가기
프로그래밍/엑셀(Excel)

[OpenPyXL] 8. 셀 안에 데이터 막대(Data Bar) 삽입하기 (feat. FormatObject, DataBar, Rule)

by 부자 꽁냥이 2022. 10. 6.

파이썬에서 엑셀을 다룰 수 있는 OpenPyXL에서는 숫자형 데이터를 갖는 칼럼에 대해서 셀 안에 데이터 막대(Data Bar)를 삽입할 수 있다. 이번 포스팅에서는 OpenPyXL을 이용하여 셀 안에 데이터 막대를 집어넣는 방법을 알아보려고 한다.


   데이터 막대(Data Bar) 삽입하기 (feat. FormatObject, DataBar, Rule)

막대를 삽입하는 과정은 FormatObject를 설정하고 이를 이용하여 DataBar 객체를 만들고 Rule 객체를 생성한다. 마지막으로 생성된 Rule 객체를 등록하면 된다.

 

아래 코드는 Units라는 헤더를 갖는 칼럼에 각 데이터 별로 막대를 삽입하는 코드이다. 설명은 주석으로 대체한다.

 

import numpy as np

from openpyxl import Workbook
from openpyxl.utils import get_column_letter
from openpyxl.formatting.rule import DataBar, FormatObject, Rule

## 엑셀에 넣을 데이터
data = np.array([
   ['Region', 'SalesRep', 'Product', 'Units'],
   ['East',   'Tom',      'Apple',    6380],
   ['West',   'Fred',     'Grape',    5619],
   ['North',  'Amy',      'Pear',     4565],
   ['South',  'Sal',      'Banana',   5323],
   ['East',   'Fritz',    'Apple',    4394],
   ['West',   'Sravan',   'Grape',    7195],
   ['North',  'Xi',       'Pear',     5231],
   ['South',  'Hector',   'Banana',   2427],
   ['East',   'Tom',      'Banana',   4213],
   ['West',   'Fred',     'Pear',     3239],
   ['North',  'Amy',      'Grape',    6520],
   ['South',  'Sal',      'Apple',    1310],
   ['East',   'Fritz',    'Banana',   6274],
   ['West',   'Sravan',   'Pear',     4894],
   ['North',  'Xi',       'Grape',    7580],
   ['South',  'Hector',   'Apple',    9814]
])

## FormatObject 객체 생성 막대 그래프의 범위가 
## 칼럼의 최소값부터 최대값까지이므로 이렇게 지정한다.
first = FormatObject(type='min')
second = FormatObject(type='max')

## DataBar 객체 생성
data_bar = DataBar(cfvo=[first, second], color="ADD8E6", 
                   showValue=None, minLength=None, maxLength=None)

## Rule 객체 생성
rule = Rule(type='dataBar', dataBar=data_bar)

wb = Workbook()
ws = wb.active

## 데이터를 시트에 삽입
for row in data:
    ws.append(row.tolist())

target_column = 4 ## 네 번째 칼럼
column_letter = get_column_letter(target_column) ## D
start_row = ws[column_letter][1].coordinate ## D2
end_row = ws[column_letter][-1].coordinate ## D17

## 처음 시트에 삽입시 문자형으로 저장되므로 이를 숫자형으로 변환
for x in ws[start_row:end_row]:
    cell = x[0]
    cell.value = int(cell.value)

# Formatting을 적용할 셀 범위와 Rule 객체 등록
ws.conditional_formatting.add(f"{start_row}:{end_row}", rule)

wb.save('sample_08.xlsx')
wb.close()

 

코드를 실행하면 위와 같이 데이터 막대가 잘 생성된 것을 알 수 있다.


참고자료

 

openpyxl 문서 - https://openpyxl.readthedocs.io/en/stable/formatting.html#databar

stackoverflow - https://stackoverflow.com/questions/61031550/write-excel-file-from-pandas-with-bar-chart-formatting-within-column-created-usi


댓글


맨 위로