掛算の概念がわかりやすい九九表をPythonでExcelファイルとして自動生成する

※末尾にExcelやPDF形式の九九表のダウンロード用URLがあります。

# 掛算の概念がわかりやすい九九表について

以前、掛算の概念がわかりやすい九九表というものがTwitterで話題になっていました。

[九九を理解するための表がとても分かりやすいと好評「ビジュアルで解る」「子どもの時に欲しかった」 - Togetter](https://togetter.com/li/1095939) @togetter_jpさんから


かつて大昔自分が小学生のころに丸暗記していた頃の表よりもはるかに掛け算の意味・概念そのものがわかりやすい表現のものが多数提案されており、「なぜ掛け算で面積が計算できるのか」なども量的・直感的に理解しながら覚えられると感じました。

たまたま自分の子どもにもそろそろ掛け算九九表が必要かなという時期になってきたので、一番よさそうなものを探していたところ、見た目としては下記の方が作られたレイアウトが最も見やすいと感じました。
（似たようなレイアウトの表は多数見つかったので、どなたがオリジナルなのかは調査が不十分なため申し訳ございません。問題があれば取り下げます。）

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">うちの子がかけ算に興味もちだしたのでこれを参考に面積との関係がわかりやすい九九表つくってみました。<a href="https://twitter.com/kitamoooon/status/882630022720233472?fbclid=IwAR1WifhsCCuJyWO9NHnGPCf99ygPoAOCLK5seQU4IryoQ75_nnxT9g6QnL0">@kitamoooonさんより</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こちらはとても見やすく素晴らしいのですが、画像のままだったので好きな形に編集ができませんでした。自分で色をいじったり最大数を九九までだけでなく10x10とか20x20まで作ってみたかったので、PythonでExcel表として出力できるコードを書いてみました。

なお、Togetterのまとめ上は、最初にこういった図を提案されたのは[こちらのツイートをされた@L_starさん](https://twitter.com/L_star/status/847255745284325380/photo/1)のようです。シンプルな考え方なので、大昔にも同様のアイデアがあったかどうかまでは調査できていません。


# Excelでできた掛算の概念がわかりやすい九九表をPythonで自動生成する

下記のコード中の「num」を自由に変更することで任意サイズの上記のタイプの九九表が自動生成されます。

![MultiplyTable9x9.png](https://qiita-image-store.s3.amazonaws.com/0/33040/42f408f3-2e97-848c-db45-6233db3e0b83.png)



上図のようなExcelファイルの表を生成できるコードがこちらです。
[XlsxWriter](http://python.zombie-hunting-club.com/entry/2017/11/03/224202)というExcelのファイルを出力できるライブラリを使っています。
Excel上でも好きなデザインとして編集しやすいように、セルだけで表現せず、掛け算の結果を表示するラベル部分はテキストボックスとして生成しています。


``` Python
import xlsxwriter as excel

#作成したい掛算表の数の最大値（縦横同数）
num = 9
max_cell = sum(range(1,num+1))

# Excelのファイル準備
wb = excel.Workbook("MultiplyTable"+str(num)+"x"+str(num)+".xlsx")
ws = wb.add_worksheet(str(num)+"x"+str(num))

# セルのサイズを正方形に
for i in range(max_cell):
    ws.set_row(i, 40.5)
    ws.set_column(i,i, 6.13)

# セルの四方を囲む＆文字色白
cell_format = wb.add_format(
    {'font_color': 'white',
    'font_size' : 20,
    'border' : 1,
    'bg_color' : '#E9E9E9'})

# 九九の表を作る
sum_i = 0
for i in range(1, num+1):
    sum_j = 0
    for j in range(1, num+1):
        v = i * j #九九の計算

        # 九九に相当する面積分各セルを数字で埋める
        for ii in range(0, i):
            for jj in range(0, j):
                ws.write(sum_j+jj, sum_i+ii, jj*i+ii+1, cell_format)

        # 1行目・1列目は色付き、2乗のマスは赤、それ以外は薄いグレーに設定    
        if sum_i == sum_j : f_color = '#EA5532'
        elif sum_i == 0 : f_color = '#00A95F'
        elif sum_j == 0 : f_color = '#187FC4'
        else : f_color = '#1A1A1A'

        # ラベル用テキストボックスの書式設定
        op = {
            'width': 48*i,
            'height': 54*j,
            'font': {'name': 'Arial','size': 40+(v/1.5), 'color' : f_color},
            'align': {'vertical': 'middle','horizontal': 'center'},
            'fill': {'none': True},
            'line': {'color': '#1A1A1A','width': 8}
            }

        # ラベル用テキストボックスの作成
        ws.insert_textbox(row = sum_j, col =  sum_i, text=str(v) , options=op)
        sum_j += j
    sum_i += i
wb.close()
```

# 出力されたファイルのダウンロード

出来上がったExcelやPDFのファイルのみ必要な方は下記からダウンロードをお願いします。これらは特にライセンスや著作権を主張するつもりはないのでパブリックドメインとして公開します。
[9x9のExcel九九表](https://drive.google.com/file/d/1z63UtHxS0-KaBFgrCD0hQ_bHP6Lmnyqi/view?usp=sharing)　　[9x9のPDF九九表(A4サイズ)](https://drive.google.com/file/d/1tWVhxR2Cnj3ZxXGgipcA8v1WVpuWMxXq/view?usp=sharing)
[10x10のExcel九九表](https://drive.google.com/file/d/1MY3D5cqht2d_tBKm47mmJoFMkgDvc6wv/view?usp=sharing)　[10x10のPDF九九表(A4サイズ)](https://drive.google.com/file/d/1SA2vapq7I4xsSdMlN2Dnvb5KWkJvINCx/view?usp=sharing)
[20x20のExcel九九表](https://drive.google.com/file/d/1KfRMwHKFFD_aOm3UDd2Ch4AKr_b01bDq/view?usp=sharing)　[20x20のPDF九九表(A3サイズ)](https://drive.google.com/file/d/1vHTRseF6rFIXfem6aH0JLaRFY5dFy4tB/view?usp=sharing)

投げ銭代わりに「いいね」やシェアなどしていただけると嬉しいです。

# Acknowledgement

上記で紹介したツイートやTogetterまとめのほか、この形式の九九表を考えられた全ての皆さまに感謝します。