Home » Python » OpenPyXLの使い方 » OpenPyXLを使って折り返して全体を表示する

OpenPyXLを使って折り返して全体を表示する

動作検証バージョン:Windows 10 Pro(64-bit)+ Python 3.11.1(64-bit) + OpenPyXL 3.0.10

「openpyxl excel 折り返して全体を表示」
「python openpyxl 折り返して全体を表示」
といった検索キーワードで、時折このサイト『インストラクターのネタ帳』へアクセスがあります。

Excelで作られたファイルを操作するライブラリ「OpenPyXL」を使って、[セルの書式設定]ダイアログボックス-[配置]タブの、[文字の制御]欄-[折り返して全体を表示する]チェックボックスをOnの状態にするには、

どのようなコードを書けばいいのか、調べていた方による検索でしょう。

折り返して全体を表示する基本

以下のスクリプトが参考にしてください。

import openpyxl as xl

bk = xl.Workbook()
ws = bk.worksheets[0]

ws['A1'].value = 'ハロー・ワールド'
ws['A1'].alignment = xl.styles.Alignment(wrapText=True)

bk.save(r'c:\temp\hello_world.xlsx')

上記のスクリプトを実行すると、先頭シートのA1セルに文字列「ハロー・ワールド」が入力され、下図のように[折り返して全体を表示する]がOnの状態になっているhello_world.xlsxブックが、

Cドライブのtempフォルダーに作成されます。

Cell.alginment属性の書き方

折り返して全体を表示する設定を行っているのは、

ws['A1'].alignment = xl.styles.Alignment(wrapText=True)

の行です。ここを、

ws['A1'].alignment.wrapText = True

のように書きたくなる方がいらっしゃると思うのですが、OpenPyXLのCell.alignment属性等で、このような書き方はできません。

ws['A1'].alignment.wrapText = True

を実行すると

AttributeError: Style objects are immutable and cannot be changed.Reassign the style with a copy

と例外が発生してしまいます。

先述のサンプルのように、

ws['A1'].alignment = xl.styles.Alignment(wrapText=True)

とする必要があります。

from openpyxl.styles import Alignmentでインポートした場合

なお、import文で

from openpyxl.styles import Alignment

としておけば、

ws['A1'].alignment = Alignment(wrapText=True)

と書くこともできます。
書籍やネットでは、この書き方を紹介しているほうが多いように感じます。

Alignment型の変数を使う場合

また、

wrap_text = xl.styles.Alignment(wrapText=True)
ws['A1'].alignment = wrap_text

のように、変数を使って書くことも可能です。

折り返して全体を表示する設定を複数のセルに

「python openpyxl 折り返して全体を表示 1行丸ごと」
といった検索キーワードでのアクセスもあります。

先頭シートの1行目にデータを入力し、Cドライブtempフォルダーにorg.xlsxとして保存しておいてから、以下のスクリプトを実行してください。

import openpyxl as xl

bk = xl.load_workbook(r'c:\temp\org.xlsx')
ws = bk.worksheets[0]

wrap_text = xl.styles.Alignment(wrapText=True)
for cel in ws['1:1']:
    cel.alignment = wrap_text

bk.save(r'c:\temp\new.xlsx')

下図のように、1行目が折り返して全体を表示した状態になります。

「python openpyxl 折り返して全体を表示 1行丸ごと」
とのことですが、どちらかというと特定の1列に対して、折り返して全体を表示する設定を行いたい場合が多いように私には思えます。

for cel in ws['1:1']:

の部分を、

for cel in ws['G:G']:

のように指定すれば、G列が折り返して全体が表示されます。

全セルに対して折り返して全体を表示する設定を行いたいのであれば、以下のような2重ループを使ったスクリプトです。

import openpyxl as xl

bk = xl.load_workbook(r'c:\temp\org.xlsx')
ws = bk.worksheets[0]

wrap_text = xl.styles.Alignment(wrapText=True)
for row in ws.iter_rows():
  for cel in row:
    cel.alignment = wrap_text

bk.save(r'c:\temp\new.xlsx')

実行すると、

上図のような状態になります。

最終更新日時:2023-06-13 13:41

[スポンサードリンク]

Home » Python » OpenPyXLの使い方 » OpenPyXLを使って折り返して全体を表示する

「OpenPyXLの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.