エクセルで横方向に複数のセルを選択して、その範囲内で文字を中央に配置したいことがよくあります。例えば、以下のように表のタイトルを表の中央に配置したい場合です。

table title

このような文字の配置を行うには、エクセルでは以下の2通りの方法があります。

  1. 範囲を選択して[セルの書式設定]画面で[文字の配置]を[選択範囲内で中央]に設定する
  2. 範囲を選択して[ホーム]の[セルを結合して中央揃え]ボタンをクリックする

今回はこの2つをPythonで行う方法をご紹介します。ライブラリには、Excelファイルの操作によく利用されているopenpyxlを使います。

本記事の目次
本記事のプログラムは、「Windows10 + Python3.7 + openpyxl3.0.3」で実行確認しています。Excelブックは「Excel2019」で作成したものを使用しています。

サンプルのExcelブック

今回は以下のような表が入力されたExcelブックをサンプルに使います。この表のタイトルをB2〜F2の範囲で中央に配置します。

事業所別損益_202008.xlsx

sample image

方法1:openpyxlで[選択範囲内で中央]を設定する

ExcelでB2〜F2を選択して「文字の配置」を[選択範囲内で中央]に設定するということは、B2〜F2のすべてのセルにこの設定を行うことを意味します。Pythonでプログラミングするには、ループ処理で1つずつセルに設定します。

今回使用するopenpyxlで「文字の配置」を設定するには、セル.alignmentに設定内容を代入します。設定内容は、Alignment()のかっこ内にキーワード引数で指定します。Alignmentopenpyxl.stylesからインポートしておきます。今回はhorizontal="centerContinuous"を入力して、横方向の配置を[選択範囲内で中央]にします。B2〜F2のすべてのセルについて、ループ処理によりこの設定を行います。

xl_text_centering1.py
import openpyxl
from openpyxl.styles import Alignment

wb = openpyxl.load_workbook("事業所別損益_202008.xlsx")
ws = wb.worksheets[0]

# B2~F2のセルに[選択範囲内で中央]を設定
for row in ws["B2:F2"]:
    for cell in row:
        cell.alignment = Alignment(horizontal="centerContinuous")

wb.save("事業所別損益_202008_タイトル中央1.xlsx")

ここで、ws["B2:F2"]のように「セル範囲(レンジ)」を指定すると、ループ処理では1行ずつ列挙します。そのため、そこから1セルずつ取り出すには、1行文のデータ(変数row)をさらにループ処理します。つまり、for文は2重になります。

"B2:F2"のようにセル範囲が1行分であることが明白は場合は、以下のように[0]を付加してコードを短く書くことも可能です。

...
for cell in ws["B2:F2"][0]:
    cell.alignment = Alignment(horizontal="centerContinuous")
...

Excelで確認してみましょう

上記のコードで保存したブック(事業所別損益_202008_タイトル中央1.xlsx)をExcelで開いて、ちゃんと設定できているか確認してみます。以下のようにB2~F2の範囲を選択して、右クリックのメニューから[セルの書式設定]を選択すると、以下のような画面が表示されます。

この画面で[配置]タブをクリックすると、以下のように[文字の配置]-[横位置]に[選択範囲内で中央]が設定されているのを確認できます。

事業所別損益_202008_タイトル中央1.xlsx

方法2:openpyxlで[セルを結合して中央揃え]を実行する

つぎに、PythonでB2~F2に対して[セルを結合して中央揃え]を実行する方法を説明します。

openpyxlで「セルを結合する」には、ワークシート.merge_cells()を用います。このかっこ内に、結合するセル範囲(レンジ)をキーワード引数で指定します。今回はB2~F2のセルを結合するので、range_string="B2:F2"を入力します。

さらに、B2セルの[文字の配置]の[横位置]を[中央揃え]に設定します。[文字の配置]を指定するには、先ほど[選択範囲内で中央]を設定したときと同じくAlighment()を用います。今回は[中央揃え]なので、かっこ内にはhorizontal="center"を入力します。

これで「1)セルを結合して、2)中央揃え」の2つの処理が以下のコードにより実行できます。

xl_text_centering2.py
import openpyxl
from openpyxl.styles import Alignment

wb = openpyxl.load_workbook("事業所別損益_202008.xlsx")
ws = wb.worksheets[0]

# B2~F2のセルを結合
ws.merge_cells(range_string="B2:F2")
# B2セルに[中央揃え]を設定
ws["B2"].alignment = Alignment(horizontal="center")

wb.save("事業所別損益_202008_タイトル中央2.xlsx")

Excelで確認してみましょう

上記のコードで保存したブック(事業所別損益_202008_タイトル中央2.xlsx)をExcelで開いて、ちゃんと設定できているか確認してみます。以下のように1)結合された部分を選択すると、[ホーム]リボンの[セルを結合して中央揃え]ボタンがONになっているのを確認できます。

事業所別損益_202008_タイトル中央2.xlsx

実際のExcelの[セルを結合して中央揃え]ボタンはもう少し高機能

上記のコードはExcelの[セルを結合して中央揃え]ボタンを完全には再現していません。今回の場合は「B2セル」にタイトルが入力されている必要がありますが、実際のExcelは「C2セル」や「D2セル」に入力していても大丈夫です。また、[セルを結合して中央揃え]ボタンで実行すると、B2~F2のセルすべてに[中央揃え]を設定しますが、今回はB2セルだけにしています。どちらも見た目は一緒になります。

openpyxlで「文字の配置」を設定する方法のまとめ

上記のようにopenpyxlで「文字の配置」を設定するには、Alignment()を用います。設定方法について一通り以下にまとめておきます。

横位置

今回は「選択範囲内で中央」と「中央揃え」を設定しましたが、openpyxlで横位置を設定するには以下の表の設定値を用います。

import openpyxl
from openpyxl.styles import Alignment

...
セル.alignment = Alignment(horizontal=横位置の設定値)
openpyxlの「横位置」の設定値
横位置 設定値
標準 "general"
左詰め(インデント) "left"
中央揃え "center"
右詰め(インデント) "right"
繰り返し "fill"
両端揃え "justify"
選択範囲内で中央 "centerContinuous"
均等割り付け(インデント) "distributed"

Excelの「セルの書式設定」画面では、以下のようなドロップダウンリストから選択します。
horizontal align

縦位置

一方、縦位置を設定するには、以下のようにAlignment()のかっこ内にvertical=縦位置の設定値を入力して指定します。縦位置の設定値には、以下の表の値を用います。

import openpyxl
from openpyxl.styles import Alignment

...
セル.alignment = Alignment(vertical=縦位置の設定値)
openpyxlの「縦位置」の設定値
縦位置 設定値
上詰め "top"
中央揃え "center"
下詰め "bottom"
両端揃え "justify"
均等割り付け "distributed"

Excelの「セルの書式設定」画面では、以下のようなドロップダウンリストから選択します。

vertical align

横と縦は一緒に設定する

横と縦の両方を設定する場合は、以下のように一緒に設定します。

import openpyxl
from openpyxl.styles import Alignment

...
セル.alignment = Alignment(horizontal=横位置の設定値, vertical=縦位置の設定値)

最後に

今回は1箇所の「文字の配置」だけをPythonで設定しましたが、1つだけではあまり恩恵を感じないと思います。膨大な箇所を修正しなければならない場合などに威力を発揮します。特に同じ書式のExcelファイルを大量に修正する場合などはかなり省力化できますので、ぜひ参考にしてください。

また、これはExcel全般についての話になりますが、通常は[選択範囲内で中央]のほうを用いて揃えます。以下の書籍「Excel 最強の教科書[完全版]」でも指摘されていますが、セルを結合してしまうと、表のコピーが思い通りいかなかったり、列や行を挿入する手順が複雑になり、トラブルの原因にもなります(本書のp.56を参照)。