openpyxlで表(テーブル)を作る方法を説明します。
主に行、列、セル、フォントの操作が出来れば十分だと思いますので、これらについて解説します。
過去の記事で基本的なopenpyxlの使い方や、グラフ(チャート)の作り方は解説しました。
しかし、Excelのキホンである、セルの操作等を解説していませんでした。自分も良く忘れるので、備忘録がてら、紹介したいと思います。
「Excelを使って綺麗な表を自動で作りたい!」という方は、是非考にしてください。
まずはopenpyxlでExcelファイルを作成する
今回の記事では、以下のコードのように、ワークブックオブジェクトはwb、ワークシートオブジェクトはwsとします。
import pandas as pd
import numpy as np
from openpyxl import Workbook
wb = Workbook()
ws = wb.create_sheet("worksheet", 0)
#コードを追加していく
wb.save("test.xlsx")
行と列の設定
行の高さを設定
行の高さを変えたい場合は、以下のようにします。row_dimensions[1].heightとすると、1行目の高さを変更できます。以下の例では1行目の高さを20に設定しています。
注意点としては、row_dimensionsには行を表す数値をいれる、ということです。
ws.row_dimensions[1].height = 20
列の幅を設定
列の幅を変えたい場合は、以下のようにします。column_dimensions[“A”].widthとするとA列の幅を変えることが出来ます。以下の例ではA列の幅を20に設定しています。
注意点としては、column_dimensionsには列を表すアルファベットを入れる、という事です。
ws.column_dimensions["A"].width =20
セルの設定
Excelで表を作るときに最も大切なセルの操作について解説します。
全てを解説するには時間が非常にかかります。ここに記載出来ないこともあるので、公式ドキュメントやソースコードもみましょう。
使用しているセルの範囲を確認する
使用しているセルの範囲を確認するには、calculate_dimension()かdimensionsを使います。もしA1~C9までの範囲のセルを使用していれば、”A1:C9“と表示されます。
ws.calculate_dimension()
#または
ws.dimensions
#=> A1:C9
セルの情報を取得する
余り使うことはないと思いますが、指定したセルの情報を取得する方法です。
coordinateでセルの番地を、column_letterでセルの列を表すアルファベットを、col_idxで行を表す番号を取得できます。
ws.cell(row=1, column=1).coordinate
#=> A1
ws.cell(row=1, column=1).column_letter)
#=> A
ws.cell(row=1, column=1).col_idx)
#=> 1
セルをマージする
セルをマージするには、merge_cellsを使います。
merge_cellsの書き方は以下のように2通りあります。以下の例では、どちらも“B7″とB8”セルをマージしています。
#start_rowとend_rowでマージしたいセルの行範囲を指定
#start_columnとend_columnでマージしたセルの列範囲を指定
ws.merge_cells(start_row=7, end_row=8, start_column=1, end_column=1)
#Excelでのセル表記を直接してもOK
ws.merge_cells("B7:B8")
ハイパーリンクを設定する
ハイパーリンクを設定するには、以下のようにhyperlinkを使います。
以下の例では、1行目2列、つまりB1セルの値にハイパーリンクを設定して、yahooにリンクするようにしています。
ws.cell(row=1, column=2).hyperlink = "https://yahoo.co.jp"
セルの枠線(ボーダー)の設定
セルの枠線を設定するには、BorderとSideをインポートします。枠線の色も変えたい場合は、Colorもインポートする必要があります。
from openpyxl.styles.borders import Side, Border
from openpyxl.styles.colors import Color
セルの枠線を設定するには、borderにBorderオブジェクトをセットします。
枠線の上、下、左、右の設定をするには、Borderのleft、right、top、bottomにSideオブジェクトをセットします。
Sideには線のスタイルと、色を指定できます。色の指定は16進数で指定します。
より詳しい使い方を知りたい場合は、公式ページのSide、Border、Colorを見ましょう。
ws.cell(row=1, column=1).border = Border(
left = Side(style="thick", color = Color("000000")),
right = Side(style="dotted", color = Color("000000")),
top = Side(style="dotted", color = Color("000000")),
bottom = Side(style="dotted", color = Color("000000"))
)
セル内での文字の配置を設定する
セル内での文字の配置を設定する為に、Alignmentをインポートします。
from openpyxl.styles.alignment import Alignment
セル内での文字配置を設定する為には、alignmentにAlignmentオブジェクトをセットします。
Alignmentのhorizonalで水平方向の配置を設定して、verticalで垂直方向の配置を設定します。
horizonalには‘justify’, ‘centerContinuous’, ‘right’, ‘center’, ‘general’, ‘fill’, ‘distributed’, ‘left’のいずれかをセットします。
verticalには‘justify’, ‘center’, ‘top’, ‘bottom’, ‘distributed’のいずれかをセットします。
また、文字の折り返しの指定したい場合はwrap_textで行います。
文字の角度を変えたい場合は、text_rotationに角度を指定するとテキストの向きを変えることが出来ます。
Alignmentの使い方詳細をもっと知りたい方は、公式ページのAlignmentのページを見て下さい。
ws.cell(row=7, column=1).alignment = Alignment(horizontal= "right", vertical="center", wrap_text=True)
ws.cell(row=7, column=2).alignment = Alignment(horizontal= "right", vertical="center", text_rotation=90)
セルの色を塗りつぶす
セルの色を塗りつぶすにはPatternFillをインポートする必要があります。また、色の指定のためにColorも必要になります。
from openpyxl.styles.alignment import Alignment
from openpyxl.styles.colors import Color
色の指定はColorで行います。Colorには16進数を表す文字列を渡します。
PatternFillのpatternTypeに塗りつぶし方法を指定し、fgColorに色を指定します。
patternTypeには‘darkUp’, ‘lightTrellis’, ‘darkHorizontal’, ‘darkGray’, ‘lightHorizontal’, ‘darkGrid’, ‘lightUp’, ‘darkDown’, ‘darkTrellis’, ‘lightGrid’, ‘lightGray’, ‘lightVertical’, ‘gray125’, ‘gray0625’, ‘mediumGray’, ‘lightDown’, ‘darkVertical’, ‘solid’のいずれかを指定します。
通常の塗りつぶしなら、solidで十分です。
色の指定はColorで行います。Colorを使って色指定を行う為には、Colorに16進数を渡します。
cell_color = Color("87CEEB") #16進数を指定
ws.cell(row=2, column=1).fill = PatternFill(patternType="solid", fgColor = cell_color)
また、あまり使うことは無いかもしれませんが、グラディエーションでセルを塗りつぶしたい場合は、GradientFillを使います。GradientFillではStopも使う必要があるので、一緒にインポートします
from openpyxl.styles.fills import PatternFill, GradientFill, Stop
グラデーションには2通りの塗りつぶしのがあります。線形色変化で対向に向けて色階調を線形且つ等間隔に変化させる方法と、割合変化で上下左右の位置からの割合を指定して色を変化させる方法です。
線形色変化の場合は、GradientFillのtypeにlinearを指定し、割合変化の場合はtypeにpathを指定します。
まずlinearの場合を見ていきましょう。
#Stopで色を指定
stop_0 = Stop("87CEEB", 0)
stop_1 = Stop("FFF000", 0.3)
stop_2 = Stop("FF0000", 1)
#degreeでグラディエーションの方向も変更可能
ws.cell(row=3, column=2).fill = GradientFill(type="linear", stop=[stop_0, stop_1, stop_2], degree=90.0)
ws.cell(row=5, column=2).fill = GradientFill(type="linear", stop = ["86CEEB", "FF0000", "FFF000"])
ws.cell(row=6, column=2).fill = GradientFill(type="path", stop = [stop_0, stop_1] , top=0.2, right=0.2)
グラディエーションで使用する色の指定方法は2通りあります。stopにSTOPオブジェクトのリスト渡すか、16進数で指定した色のリスト(またはタプル)を渡す方法です。
stopにStopオブジェクトを渡す場合は、Stopの引数に16進数で表した色と、数値を指定します。
この数値の値を変えることで、グラディエーションのパターンを色々変えることが出来ます。
stopに色のリストを渡した場合は、各色のグラディエーションパターンが等間隔に作られます。
degreeを指定することで、グラディエーションの方向を変えることが出来ます。
次にpathの場合を見ていきましょう。
Pathを指定した場合は、塗りつぶしの変化割合をtop、bottom, right、leftで調整します。
例えば、top = 0.2と指定すると、セルの上枠(ボーダー)から2割が塗りつぶされる、という指定のようです(個人的な感想としては、余り深く考えずに、色々値を指定して試してみる方が良いです)。
#pathを指定。上から2割、右から8割
ws.cell(row=6, column=2).fill = GradientFill(type="path", stop = ["FF0000", "FFFFFF"] , top=0.2, right=0.2)
フォントの設定
フォントの色を変更するには、Fontをインポートする必要があります。
from openpyxl.styles.fonts import Font
フォントの種類を設定する
Fontの種類を設定するには、Fontのnameに用いたいフォントをセットします。
ws.cell(row=1, column=1).font = Font(name = "Times")
フォントサイズを変更する
フォントサイズを変更するには、Fontのszに値を指定します。
ws.cell(row=1, column=1).font = Font(sz = 20)
フォントの色を変更する
フォントの色を変えるには、Fontのcolorに色を指定します。色は16進数で指定します。
ws.cell(row=1, column=2).font = Font(color = "FF0000")
ボールド、イタリック、アンダーラインを指定する
ボールド、イタリック、アンダーラインの設定は、fontのbold、italic、underlineで行います。
boldとitalicにはTrueかFalseを設定します。
underlineには‘singleAccounting’, ‘double’, ‘doubleAccounting’, ‘single’の何れかを設定します。
ws.cell(row=1, column=3).font = Font(underline="double", bold=True, italic=True)