openpyxl chart에서 그래프 테두리 지우기

openpyxl chart에서 그래프 테두리 지우기



openpyxl은 편리한 라이브러리로 Excel 그래프도 자동으로 만들 수 있습니다.
많은 데이터에서 비슷한 많은 그래프를 만드는 경우 등, 엑셀로 뽀찌뽀찌와 클릭을 원하지 않을 때 매우 편리합니다.
편리합니다만, 그래프의 테두리를 지우거나 배경을 바꾸는 것이 잘 할 수 없었으므로, 조사해 보았습니다.

먼저 그래프 만들기



원형 차트를 표시해 봅니다.
import openpyxl
from openpyxl.chart import PieChart, Reference


wb = openpyxl.Workbook()
ws = wb.active

ws["A1"] = "りんご"
ws["B1"] = 30
ws["A2"] = "みかん"
ws["B2"] = 60

chart = PieChart()
chart.add_data(Reference(ws, min_col=2, min_row=1, max_row=2))
chart.set_categories(Reference(ws, min_col=1, min_row=1, max_row=2))

ws.add_chart(chart, "B4")
wb.save("out.xlsx")

이런 식으로 되었습니다.



이 화살표에서 테두리를 지우거나이 테두리 안쪽을 채우는 것이 목표입니다.

테두리 안을 채워 보자



조금 조사하면 plot_areagraphicalProperties 라는 것을 설정하면 좋다고 합니다.
이해하기 쉽도록 빨간색으로 바릅니다.
from openpyxl.chart.shapes import GraphicalProperties
...

chart.plot_area.graphicalProperties = GraphicalProperties(solidFill="cc0000")




음, 생각했던 범위와 다릅니다.
legend 라고 하는 것도 있습니다만, 이것은, 다른 생각이 듭니다.
뭐, 일단 해 봅시다.
녹색으로 시도합니다.
chart.legend.graphicalProperties = GraphicalProperties(solidFill="00cc00")



음, 맞습니다.
legend는 거기요.

조금 더 살펴보면,chart.graphical_properties 라는 것이 있는 것 같습니다.
Camel Case가 아니라 Snake Case입니다.

시도해 봅시다.
chart.graphical_properties = GraphicalProperties(solidFill="0000cc")



음. 안돼. 변화 없음.

검색해 보면, 움직이지 않거나, 낡은 버젼에서는 움직였다든가 몇가지 싫은 정보가 있습니다.

조사



그래서 소스를 살펴 보겠습니다.
PieChart_PieChartBase 를 상속하고 _PieChartBaseChartBase 를 상속하고 이 ChartBasegraphical_properties 가 정의되어 있습니다.

site-packages/openpyxl/chart/_chart.py
class ChartBase(Serialisable):
    ....
    graphical_properties = Typed(expected_type=GraphicalProperties, allow_none=True)

하지만, 잘 소스를 쫓아 보면, graphical_properties는 __init__ 로 None에 초기화되고 있는 것만으로 어디에서도 참조되고 있지 않습니다.
이것은 도대체 무슨 일일까요?
_write 함수에 있는 ChartSpacespPrGraphicalProperties 를 가지는 것 같습니다.

site-packages/openpyxl/chart/_chart.py
class ChartBase(Serialisable):
    ....
    def _write(self):
        ....
        cs = ChartSpace(chart=container)
        cs.style = self.style
        cs.roundedCorners = self.roundedCorners
        cs.pivotSource = self.pivotSource
        cs.spPr = self.graphical_properties  <== この行を追加
        return cs.to_tree()



할 수 있었습니다! ! !

뭐야? 버그입니까?

드디어 테두리 지우기



여기까지 할 수 있으면, 본제의 테두리를 지우는 것을 해 봅시다.
이런 코드가 되었습니다.
import openpyxl
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.shapes import GraphicalProperties, LineProperties


wb = openpyxl.Workbook()
ws = wb.active

ws["A1"] = "りんご"
ws["B1"] = 30
ws["A2"] = "みかん"
ws["B2"] = 60

chart = PieChart()
chart.add_data(Reference(ws, min_col=2, min_row=1, max_row=2))
chart.set_categories(Reference(ws, min_col=1, min_row=1, max_row=2))

chart.graphical_properties = GraphicalProperties(ln=LineProperties(noFill=True))

ws.add_chart(chart, "B4")
wb.save("out.xlsx")



할 수 있었습니다! !

사이고에게



라이브러리를 직접 만났습니다만, 뭔가 그 밖에 잘 할 수 없겠지요.
또한 시간이 있을 때 도전해 봅시다.

좋은 웹페이지 즐겨찾기