6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

python-pptxの図形一覧

Last updated at Posted at 2021-08-29

python-pptxの図形を調べてみた。

python-pptxはPowerPointをPythonでかけるライブラリです。
あまりにも画像の数が多かったり、毎回似たような表を作成しなければならないとき、自動化ツールとして活用できます。

そのため、画像挿入や表挿入、グラフ挿入に関する記事は調べればそれなりの数が出てきます。

しかし、図形の挿入となると記事はかなり少なくなるようです。

今回はpython-pptxで簡単な図形追加をまとめました。182種類の図形が追加できるようなのですが、そのうち約170個ほどを実際に出力してみています。

ちなみに、図形の細かい調整までは労力が大きすぎるので控えました。別の機会に調べてまとめたいと思います。

#図形の追加の仕方
python-pptxの図形はshapes.add_shapeメソッドで追加できます。
引数はadd_shape(MSO_SHAPE.xxx, left, top, width, height)です。
このうちのxxxの部分に何を入れるかで挿入される図形が変わります。
例えば、直線を引く場合は次のようになります。直線のメソッドはLINE_INVERSEなので、これを上のxxxの部分に入れれば良いわけです。

test.py

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.util import Cm, Pt

ppt = Presentation()
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
shapes = slide.shapes
shapes.add_shape(MSO_SHAPE.LINE_INVERSE, Cm(2),	Cm(2), Cm(2), Cm(2))
ppt.save("test.pptx")

挿入の仕方もわかったところで、一覧を見ましょう。
下のスライドは全てpython-pptxで出力しており、直接編集は一切おこなっていません。
ちなみに並べ方は任意です。

なぜ線の矢印がないのだろう。どなたか線の矢印の表示方法をご存知の方がいらっしゃれば教えてください。。。

#以下一覧
図形の下にある名前部分が、MSO_SHAPEのメソッド名です。

スクリーンショット 2021-08-29 21.16.48.png
スクリーンショット 2021-08-29 21.16.59.png
スクリーンショット 2021-08-29 21.17.12.png
List(3)のNO_SYMBOLはなぜかエラーが出ました。そのため出力からは外しています。

スクリーンショット 2021-08-29 21.17.23.png
スクリーンショット 2021-08-29 21.17.38.png
スクリーンショット 2021-08-29 21.16.28.png

#参考用コード
こちらは出力の際に使用したコードです。
ご参考になれば幸いです。

pptx-utiltest.py
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR, MSO_AUTO_SIZE
from pptx.util import Cm, Pt

OUTPUT_PATH = "shapetest.pptx"

ppt = Presentation()
SLIDE_WIDTH = ppt.slide_width
SLIDE_HEIGHT = ppt.slide_height
plot_top = Cm(2)
plotzone_height = SLIDE_HEIGHT-plot_top


def table_x(x_posi,x_size):	# 0~
	sukima = (SLIDE_WIDTH/6 - x_size) / 2
	left = SLIDE_WIDTH/6 * x_posi + sukima
	return left
def table_y(y_posi):		# 0~
	sukima = Cm(0.2)
	top = plot_top+(plotzone_height/5)*y_posi+sukima
	return top
def text_x(x_posi):
    return SLIDE_WIDTH/6*x_posi
def text_y(y_posi):
    return plot_top+(plotzone_height/5)*(y_posi+1)-Cm(1)

# Page 1
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
shapes = slide.shapes
# set line
# horizontal line
for i in range(6):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, 0, plot_top+(plotzone_height/5)*i, SLIDE_WIDTH, 0)
# virtical line
for i in range(5):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, SLIDE_WIDTH/6*(i+1), plot_top, 0, plotzone_height)

# 直線
shapes.add_shape(MSO_SHAPE.LINE_INVERSE,		table_x(0,Cm(2)),	table_y(0), Cm(2), Cm(2))

# 矢印
shapes.add_shape(MSO_SHAPE.LEFT_RIGHT_ARROW,	table_x(0,Cm(2)),	table_y(1), Cm(2), Cm(1))
shapes.add_shape(MSO_SHAPE.UP_DOWN_ARROW,		table_x(0,Cm(1)),	table_y(2), Cm(1), Cm(2))
shapes.add_shape(MSO_SHAPE.QUAD_ARROW,			table_x(0,Cm(2)),	table_y(3), Cm(2), Cm(2))

shapes.add_shape(MSO_SHAPE.LEFT_ARROW,			table_x(1, Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.RIGHT_ARROW,			table_x(1, Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.UP_ARROW,			table_x(1, Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DOWN_ARROW,			table_x(1, Cm(2)),	table_y(3), Cm(2), Cm(2))
# BENT ARROW
shapes.add_shape(MSO_SHAPE.BENT_ARROW,			table_x(2, Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.BENT_UP_ARROW,		table_x(2, Cm(2)),	table_y(1), Cm(2), Cm(2))
# CIRCULAR_ARROW
shapes.add_shape(MSO_SHAPE.CIRCULAR_ARROW,		table_x(2, Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LEFT_CIRCULAR_ARROW,	table_x(2, Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LEFT_RIGHT_CIRCULAR_ARROW,	table_x(2, Cm(2)),	table_y(4), Cm(2), Cm(2))
# curved arrow
shapes.add_shape(MSO_SHAPE.CURVED_LEFT_ARROW,   table_x(3, Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CURVED_RIGHT_ARROW,  table_x(3, Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CURVED_UP_ARROW,     table_x(3, Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CURVED_DOWN_ARROW,   table_x(3, Cm(2)),	table_y(3), Cm(2), Cm(2))
# 丸(楕円)
shapes.add_shape(MSO_SHAPE.OVAL,				table_x(3, Cm(2)),	table_y(4), Cm(2), Cm(2))
# 長方形
shapes.add_shape(MSO_SHAPE.RECTANGLE,			table_x(4, Cm(2)),	table_y(0), Cm(2), Cm(2))
# CUBE
shapes.add_shape(MSO_SHAPE.CUBE,				table_x(4, Cm(2)),	table_y(1), Cm(2), Cm(2))
# 三角
shapes.add_shape(MSO_SHAPE.RIGHT_TRIANGLE,		table_x(4, Cm(2)),	table_y(2), Cm(2), Cm(2))
# 五角形
shapes.add_shape(MSO_SHAPE.PENTAGON,			table_x(4, Cm(2)),	table_y(3), Cm(2), Cm(2))
# 五角形
shapes.add_shape(MSO_SHAPE.HEXAGON,				table_x(4, Cm(2)),	table_y(4), Cm(2), Cm(2))


# 角が丸い四角形
shapes.add_shape(MSO_SHAPE.ROUND_1_RECTANGLE,			table_x(5, Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.ROUND_2_DIAG_RECTANGLE,		table_x(5, Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.ROUND_2_SAME_RECTANGLE,		table_x(5, Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,			table_x(5, Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGULAR_CALLOUT,	table_x(5, Cm(2)),	table_y(4), Cm(2), Cm(2))

mso_list = [
	["LINE_INVERSE","LEFT_ARROW","BENT_ARROW","CURVED_LEFT_ARROW","RECTANGLE","ROUND_1_RECTANGLE"],
	["LEFT_RIGHT_ARROW","RIGHT_ARROW","BENT_UP_ARROW","CURVED_RIGHT_ARROW","CUBE","ROUND_2_DIAG_RECTANGLE"],
	["UP_DOWN_ARROW","UP_ARROW","CIRCULAR_ARROW","CURVED_UP_ARROW","RIGHT_TRIANGLE","ROUND_2_SAME_RECTANGLE"],
	["QUAD_ARROW","DOWN_ARROW","LEFT_CIRCULAR_ARROW","CURVED_DOWN_ARROW","PENTAGON","ROUNDED_RECTANGLE"],
	["","","LEFT_RIGHT_CIRCULAR_ARROW","OVAL","HEXAGON","ROUNDED_RECTANGULAR\v_CALLOUT"],
]
title_width = Cm(25)
title_left = (SLIDE_WIDTH - title_width) / 2
textbox = shapes.add_textbox(title_left, 0, title_width, plot_top)
textbox.text = "MSO_SHAPE List MAIN"
textbox.text_frame.paragraphs[0].font.size = Pt(30)
textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
textbox.text_frame.virtical_anchor = MSO_ANCHOR.MIDDLE

for row in range(5):
	for col in range(6):
		textbox = shapes.add_textbox(text_x(col), text_y(row), SLIDE_WIDTH/6, Cm(1))
		textbox.text = mso_list[row][col]
		textbox.text_frame.paragraphs[0].font.size = Pt(9)
		textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
		textbox.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE		# 図形内のテキストに合わせて、必要に応じてフォントサイズを縮小


# Page 2
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
shapes = slide.shapes
# set line
# horizontal line
for i in range(6):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, 0, plot_top+(plotzone_height/5)*i, SLIDE_WIDTH, 0)
# virtical line
for i in range(5):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, SLIDE_WIDTH/6*(i+1), plot_top, 0, plotzone_height)


shapes.add_shape(MSO_SHAPE.ARC,					table_x(0,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.BALLOON,				table_x(0,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.BEVEL,				table_x(0,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.BLOCK_ARC,			table_x(0,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CAN,					table_x(0,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CHART_PLUS,			table_x(1,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CHART_STAR,			table_x(1,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CHART_X,				table_x(1,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CHEVRON,				table_x(1,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CHORD,				table_x(1,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CLOUD,				table_x(2,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CLOUD_CALLOUT,		table_x(2,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CORNER,				table_x(2,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CORNER_TABS,			table_x(2,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CROSS,				table_x(2,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CURVED_DOWN_RIBBON,	table_x(3,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.CURVED_UP_RIBBON,	table_x(3,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DECAGON,				table_x(3,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DIAGONAL_STRIPE,		table_x(3,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DIAMOND,				table_x(3,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DODECAGON,			table_x(4,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DONUT,				table_x(4,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DOUBLE_BRACE,		table_x(4,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DOUBLE_BRACKET,		table_x(4,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DOUBLE_WAVE,			table_x(4,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.DOWN_RIBBON,			table_x(5,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.EXPLOSION1,			table_x(5,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.EXPLOSION2,			table_x(5,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FOLDED_CORNER,		table_x(5,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FRAME,				table_x(5,Cm(2)),	table_y(4), Cm(2), Cm(2))
mso_list = [
	["ARC"		,"CHART_PLUS"	,"CLOUD"		,"CURVED_DOWN_RIBBON"	,"DODECAGON"		,"DOWN_RIBBON"	],
	["BALLOON"	,"CHART_STAR"	,"CLOUD_CALLOUT","CURVED_UP_RIBBON"		,"DONUT"			,"EXPLOSION1"	],
	["BEVEL"	,"CHART_X"		,"CORNER"		,"DECAGON"				,"DOUBLE_BRACE"		,"EXPLOSION2"	],
	["BLOCK_ARC","CHERVRON"		,"CORNER_TABS"	,"DIAGONAL_STRIPE"		,"DOUBLE_BRACKET"	,"FOLDED_CORNER"],
	["CAN"		,"CHORD"		,"CROSS"		,"DIAMOND"				,"DOUBLE_WAVE"		,"FRAME"		],
]

title_width = Cm(25)
title_left = (SLIDE_WIDTH - title_width) / 2
textbox = shapes.add_textbox(title_left, 0, title_width, plot_top)
textbox.text = "MSO_SHAPE List (1)"
textbox.text_frame.paragraphs[0].font.size = Pt(30)
textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
textbox.text_frame.virtical_anchor = MSO_ANCHOR.MIDDLE

for row in range(5):
	for col in range(6):
		textbox = shapes.add_textbox(text_x(col), text_y(row), SLIDE_WIDTH/6, Cm(1))
		textbox.text = mso_list[row][col]
		textbox.text_frame.paragraphs[0].font.size = Pt(9)
		textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
		textbox.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE		# 図形内のテキストに合わせて、必要に応じてフォントサイズを縮小

# Page 3
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
shapes = slide.shapes
# set line
# horizontal line
for i in range(6):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, 0, plot_top+(plotzone_height/5)*i, SLIDE_WIDTH, 0)
# virtical line
for i in range(5):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, SLIDE_WIDTH/6*(i+1), plot_top, 0, plotzone_height)


shapes.add_shape(MSO_SHAPE.FLOWCHART_ALTERNATE_PROCESS			,table_x(0,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_CARD						,table_x(0,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_COLLATE					,table_x(0,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_CONNECTOR					,table_x(0,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_DATA						,table_x(0,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_DECISION					,table_x(1,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_DELAY						,table_x(1,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_DIRECT_ACCESS_STORAGE		,table_x(1,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_DISPLAY					,table_x(1,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_DOCUMENT					,table_x(1,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_EXTRACT					,table_x(2,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_INTERNAL_STORAGE			,table_x(2,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_MAGNETIC_DISK				,table_x(2,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_MANUAL_INPUT				,table_x(2,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_MANUAL_OPERATION			,table_x(2,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_MERGE						,table_x(3,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_MULTIDOCUMENT				,table_x(3,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_OFFLINE_STORAGE			,table_x(3,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_OFFPAGE_CONNECTOR			,table_x(3,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_OR							,table_x(3,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_PREDEFINED_PROCESS			,table_x(4,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_PREPARATION				,table_x(4,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_PROCESS					,table_x(4,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_PUNCHED_TAPE				,table_x(4,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_SEQUENTIAL_ACCESS_STORAGE	,table_x(4,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_SORT						,table_x(5,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_STORED_DATA				,table_x(5,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_SUMMING_JUNCTION			,table_x(5,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FLOWCHART_TERMINATOR					,table_x(5,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.FOLDED_CORNER						,table_x(5,Cm(2)),	table_y(4), Cm(2), Cm(2))


mso_list = [
	["FLOWCHART_\vALTERNATE_PROCESS","FLOWCHART_DECISION"				,"FLOWCHART_EXTRACT"			,"FLOWCHART_MERGE"				,"FLOWCHART\v_PREDEFINED_PROCESS"			,"FLOWCHART_SORT"				],
	["FLOWCHART_CARD"				,"FLOWCHART_DELAY"					,"FLOWCHART_INTERNAL_STORAGE"	,"FLOWCHART_MULTIDOCUMENT"		,"FLOWCHART_PREPERATION"					,"FLOWCHART_STORED_DATA"		],
	["FLOWCHART_COLLATE"			,"FLOWCHART_DIRECT_\vACCESS_STORAGE"	,"FLOWCHART_MAGNETIC_DISK"		,"FLOWCHART_OFFLINE_STRAGE"		,"FLOWCHART_PROCESS"						,"FLOWCHART\v_SUMMING_JUNCTION"	],
	["FLOWCHART_CONNECTOR"			,"FLOWCHART_DISPLAY"				,"FLOWCHART_MANUAL_INPUT"		,"FLOWCHART_\vOFFPAGE_CONNECTOR","FLOWCHART_PUNCHED_TAPE"					,"FLOWCHART_TERMINATOR"			],
	["FLOWCHART_DATA"				,"FLOWCHART_DOCUMENT"				,"FLOWCHART\v_MANUAL_OPERATION"	,"FLOWCHART_OR"					,"FLOWCHART_SEQUENTIAL\v_ACCESS_STORAGE"	,"FOLDED_CORNER"				],
]

title_width = Cm(25)
title_left = (SLIDE_WIDTH - title_width) / 2
textbox = shapes.add_textbox(title_left, 0, title_width, plot_top)
textbox.text = "MSO_SHAPE List (2) FLOWCHART"
textbox.text_frame.paragraphs[0].font.size = Pt(30)
textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
textbox.text_frame.virtical_anchor = MSO_ANCHOR.MIDDLE

for row in range(5):
	for col in range(6):
		textbox = shapes.add_textbox(text_x(col), text_y(row), SLIDE_WIDTH/6, Cm(1))
		textbox.text = mso_list[row][col]
		textbox.text_frame.paragraphs[0].font.size = Pt(9)
		textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
		textbox.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE		# 図形内のテキストに合わせて、必要に応じてフォントサイズを縮小


# Page 4
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
shapes = slide.shapes
# set line
# horizontal line
for i in range(6):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, 0, plot_top+(plotzone_height/5)*i, SLIDE_WIDTH, 0)
# virtical line
for i in range(5):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, SLIDE_WIDTH/6*(i+1), plot_top, 0, plotzone_height)


shapes.add_shape(MSO_SHAPE.FUNNEL					,table_x(0,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.GEAR_6					,table_x(0,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.GEAR_9					,table_x(0,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.HALF_FRAME				,table_x(0,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.HEART					,table_x(0,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.HEPTAGON					,table_x(1,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.HORIZONTAL_SCROLL		,table_x(1,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.ISOSCELES_TRIANGLE		,table_x(1,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LEFT_BRACE				,table_x(1,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LEFT_BRACKET				,table_x(1,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LEFT_RIGHT_RIBBON		,table_x(2,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LIGHTNING_BOLT			,table_x(2,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.MATH_DIVIDE				,table_x(2,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.MATH_EQUAL				,table_x(2,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.MATH_MINUS				,table_x(2,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.MATH_MULTIPLY			,table_x(3,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.MATH_NOT_EQUAL			,table_x(3,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.MATH_PLUS				,table_x(3,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.MOON						,table_x(3,Cm(2)),	table_y(3), Cm(2), Cm(2))
#shapes.add_shape(MSO_SHAPE.NO_SYMBOL				,table_x(3,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.NON_ISOSCELES_TRAPEZOID	,table_x(4,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.NOTCHED_RIGHT_ARROW		,table_x(4,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.OCTAGON					,table_x(4,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.PARALLELOGRAM			,table_x(4,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.PIE						,table_x(4,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.PIE_WEDGE				,table_x(5,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.PLAQUE					,table_x(5,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.PLAQUE_TABS				,table_x(5,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.REGULAR_PENTAGON			,table_x(5,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SMILEY_FACE				,table_x(5,Cm(2)),	table_y(4), Cm(2), Cm(2))


mso_list = [
	["FUNNEL"		,"HEPTAGON"				,"LEFT_RIGHT_RIBBON","MATH_MULTIPLY"	,"NON_ISOSCELES_TRAPEZOID"	,"PIE_WEDGE"		],
	["GEAR_6"		,"HORIZONTAL_SCROLL"	,"LIGHTNING_BOLT"	,"MATH_NOT_EQUAL"	,"NOTCHED_RIGHT_ARROW"		,"PLAQUE"			],
	["GEAR_9"		,"ISOSCELES_TRIANGLE"	,"MATH_DIVIDE"		,"MATH_PLUS"		,"OCTAGON"					,"PLAQUE_TABS"		],
	["HALF_FRAME"	,"LEFT_BRACE"			,"MATH_EQUAL"		,"MOON"				,"PARALLELOGRAM"			,"REGULAR_PENTAGON"	],
	["HEART"		,"LEFT_BRACKET"			,"MATH_MINUS"		,"NO_SYMBOL"		,"PIE"						,"SMILEY_FACE"		],
]

title_width = Cm(25)
title_left = (SLIDE_WIDTH - title_width) / 2
textbox = shapes.add_textbox(title_left, 0, title_width, plot_top)
textbox.text = "MSO_SHAPE List (3)"
textbox.text_frame.paragraphs[0].font.size = Pt(30)
textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
textbox.text_frame.virtical_anchor = MSO_ANCHOR.MIDDLE

for row in range(5):
	for col in range(6):
		textbox = shapes.add_textbox(text_x(col), text_y(row), SLIDE_WIDTH/6, Cm(1))
		textbox.text = mso_list[row][col]
		textbox.text_frame.paragraphs[0].font.size = Pt(9)
		textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
		textbox.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE		# 図形内のテキストに合わせて、必要に応じてフォントサイズを縮小

# Page 5
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
shapes = slide.shapes
# set line
# horizontal line
for i in range(6):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, 0, plot_top+(plotzone_height/5)*i, SLIDE_WIDTH, 0)
# virtical line
for i in range(5):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, SLIDE_WIDTH/6*(i+1), plot_top, 0, plotzone_height)


shapes.add_shape(MSO_SHAPE.RIGHT_BRACE				,table_x(0,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.RIGHT_BRACKET			,table_x(0,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.RIGHT_TRIANGLE			,table_x(0,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SNIP_1_RECTANGLE			,table_x(0,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SNIP_2_DIAG_RECTANGLE	,table_x(0,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SNIP_2_SAME_RECTANGLE	,table_x(1,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SNIP_ROUND_RECTANGLE		,table_x(1,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SQUARE_TABS				,table_x(1,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_10_POINT			,table_x(1,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_12_POINT			,table_x(1,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_16_POINT			,table_x(2,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_24_POINT			,table_x(2,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_32_POINT			,table_x(2,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_4_POINT				,table_x(2,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_5_POINT				,table_x(2,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_6_POINT				,table_x(3,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_7_POINT				,table_x(3,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STAR_8_POINT				,table_x(3,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.STRIPED_RIGHT_ARROW		,table_x(3,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SUN						,table_x(3,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.SWOOSH_ARROW				,table_x(4,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.TEAR						,table_x(4,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.TRAPEZOID				,table_x(4,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.U_TURN_ARROW				,table_x(4,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.UP_RIBBON				,table_x(4,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.VERTICAL_SCROLL			,table_x(5,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.WAVE						,table_x(5,Cm(2)),	table_y(1), Cm(2), Cm(2))

mso_list = [
	["RIGHT_BRACE"			,"SNIP_2_SAME_RECTANGLE","STAR_16_POINT","STAR_6_POINT"			,"SWOOSH_ARROW"	,"VERTICAL_SCROLL"],
	["RIGHT_BRACKET"		,"SNIP_ROUND_RECTANGLE"	,"STAR_24_POINT","STAR_7_POINT"			,"TEAR"			,"WAVE"],
	["RIGHT_TRIANGLE"		,"SQUARE_TABS"			,"STAR_32_POINT","STAR_8_POINT"			,"TRAPEZOID"	,""],
	["SNIP_1_RECTANGLE"		,"STAR_10_POINT"		,"STAR_4_POINT"	,"STRIPED_RIGHT_ARROW"	,"U_TURN_ARROW"	,""],
	["SNIP_2_DIAG_RECTANGLE","STAR_12_POINT"		,"STAR_5_POINT"	,"SUN"					,"UP_RIBBON"	,""],
]

title_width = Cm(25)
title_left = (SLIDE_WIDTH - title_width) / 2
textbox = shapes.add_textbox(title_left, 0, title_width, plot_top)
textbox.text = "MSO_SHAPE List (4)"
textbox.text_frame.paragraphs[0].font.size = Pt(30)
textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
textbox.text_frame.virtical_anchor = MSO_ANCHOR.MIDDLE

for row in range(5):
	for col in range(6):
		textbox = shapes.add_textbox(text_x(col), text_y(row), SLIDE_WIDTH/6, Cm(1))
		textbox.text = mso_list[row][col]
		textbox.text_frame.paragraphs[0].font.size = Pt(9)
		textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
		textbox.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE		# 図形内のテキストに合わせて、必要に応じてフォントサイズを縮小

# Page 5
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
shapes = slide.shapes
# set line
# horizontal line
for i in range(6):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, 0, plot_top+(plotzone_height/5)*i, SLIDE_WIDTH, 0)
# virtical line
for i in range(5):
    shapes.add_shape(MSO_SHAPE.LINE_INVERSE, SLIDE_WIDTH/6*(i+1), plot_top, 0, plotzone_height)


shapes.add_shape(MSO_SHAPE.DOWN_ARROW_CALLOUT					,table_x(0,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LEFT_ARROW_CALLOUT					,table_x(0,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.UP_ARROW_CALLOUT						,table_x(0,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.RIGHT_ARROW_CALLOUT					,table_x(0,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LEFT_RIGHT_ARROW_CALLOUT				,table_x(0,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.UP_DOWN_ARROW_CALLOUT				,table_x(1,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_1						,table_x(1,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_1_ACCENT_BAR			,table_x(1,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_1_BORDER_AND_ACCENT_BAR	,table_x(1,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_1_NO_BORDER				,table_x(1,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_2						,table_x(2,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_2_ACCENT_BAR			,table_x(2,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_2_BORDER_AND_ACCENT_BAR	,table_x(2,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_2_NO_BORDER				,table_x(2,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_3						,table_x(2,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_3_ACCENT_BAR			,table_x(3,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_3_BORDER_AND_ACCENT_BAR	,table_x(3,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_3_NO_BORDER				,table_x(3,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_4						,table_x(3,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_4_ACCENT_BAR			,table_x(3,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_4_BORDER_AND_ACCENT_BAR	,table_x(4,Cm(2)),	table_y(0), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.LINE_CALLOUT_4_NO_BORDER				,table_x(4,Cm(2)),	table_y(1), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.OVAL_CALLOUT							,table_x(4,Cm(2)),	table_y(2), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.QUAD_ARROW_CALLOUT					,table_x(4,Cm(2)),	table_y(3), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.RECTANGULAR_CALLOUT					,table_x(4,Cm(2)),	table_y(4), Cm(2), Cm(2))
shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGULAR_CALLOUT			,table_x(5,Cm(2)),	table_y(0), Cm(2), Cm(2))

mso_list = [
	["DOWN_ARROW_CALLOUT"		,"UP_DOWN_ARROW_CALLOUT"					,"LINE_CALLOUT_2"						,"LINE_CALLOUT_3_ACCENT_BAR"		,"LINE_CALLOUT_4\v_BORDER_AND_ACCENT_BAR","RPINDED_RECTANGULAR\v_CALLOUT"],
	["LEFT_ARROW_CALLOUT"		,"LINE_CALLOUT_1"							,"LINE_CALLOUT_2_ACCENT_BAR"			,"LINE_CALLOUT_3\v_BORDER_AND_ACCENT_BAR","LINE_CALLOUT_4_NO_BORDER",""],
	["UP_ARROW_CALLOUT"			,"LINE_CALLOUT_1_ACCENT_BAR"				,"LINE_CALLOUT_2\v_BORDERED_AND_ACCENT_BAR","LINE_CALLOUT_3_NO_BORDER","OVAL_CALLOUT",""],
	["RIGHT_ARROW_CALLOUT"		,"LINE_CALLOUT_1\v_BORDERED_AND_ACCENT_BAR"	,"LINE_CALLOUT_2_NO_BORDER"				,"LINE_CALLOUT_4","QUAD_ARROW_CALLOUT"								,""],
	["LEFT_RIGHT_ARROW_CALLOUT"	,"LINE_CALLOUT_1_NO_BORDER"					,"LINE_CALLOUT_3" 						,"LINE_CALLOUT_4_ACCENT_BAR","RECTANGULAR_CALLOUT"					,""],
]

title_width = Cm(25)
title_left = (SLIDE_WIDTH - title_width) / 2
textbox = shapes.add_textbox(title_left, 0, title_width, plot_top)
textbox.text = "MSO_SHAPE List (5) callout"
textbox.text_frame.paragraphs[0].font.size = Pt(30)
textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
textbox.text_frame.virtical_anchor = MSO_ANCHOR.MIDDLE

for row in range(5):
	for col in range(6):
		textbox = shapes.add_textbox(text_x(col), text_y(row), SLIDE_WIDTH/6, Cm(1))
		textbox.text = mso_list[row][col]
		textbox.text_frame.paragraphs[0].font.size = Pt(9)
		textbox.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
		textbox.text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE

ppt.save(OUTPUT_PATH)

まとめ

このように出力してふと思ったのですが、パワーポイントにおける図形って、毎回毎回違うものが求められるような気がします。
図形に関しては、自動化を目指すよりはショートカットを覚えた方が効率は良さそうだと感じました。
実用性がありそうなのは、直線を引くときか、何個も同じような図形を綺麗に配置するときくらいだと思います。

6
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?