チュートリアル

簡単にライブラリーを使用するためのチュートリアルコレクション

2026-09-30

Python で Excel ワークシートの背景色と背景画像を設定する方法

毎月同じ形式の帳票を出力しているのに、見出し行の色だけは毎回手作業で塗り直している——そんな状況は、思った以上に多くあります。セルの塗りつぶしは「データの意味を補う書式」なので、値の書き込みと同じタイミングでコードから設定できたほうが、フォーマットの崩れも属人化も防げます。

本記事では、Spire.XLS for Python を使用して Python で Excel ワークシートの背景色と背景画像を設定する方法 を解説します。セル範囲を単色で塗る方法、見出し行だけを強調する方法、シート全体に画像を敷く方法、そしてその 2 つを重ねる方法を、順を追って確認していきます。

クイックナビゲーション

準備:Spire.XLS for Python のインストール

本記事のコードは Spire.XLS for Python と plum-dispatch v1.7.4 を使用しています(動作確認は Spire.XLS for Python 16.8.2)。pip コマンドでインストールしてください。

pip install Spire.XLS

スクリプト側では、次の 2 行をインポートします。

from spire.xls import *
from spire.xls.common import *

手動でインストールする場合は、Spire.XLS for Python のダウンロードページ からパッケージを取得できます。

「セルの背景色」と「シートの背景画像」は別のもの

どちらも「背景を飾る機能」に見えますが、Excel の内部ではまったく別の仕組みです。ここを混同すると「見出し行に画像を敷きたい」「シート全体を赤くしたい」といった要求で迷うため、先に整理しておきます。

項目 セルの背景色 シートの背景画像
設定に使うプロパティ CellRange.Style.Color Worksheet.PageSetup.BackgoundImage
適用される範囲 指定したセル範囲のみ ワークシート全体(1 シートに 1 枚)
指定できるもの 単色・グラデーション・パターン 画像ファイル
印刷・PDF 出力 反映される 反映されない(画面表示のみ)
主な用途 見出し行の強調、縞模様、注意喚起 レイアウトの下地、ロゴやテクスチャの敷き込み

「印刷したときに色を残したいのか、画面上の見栄えだけを変えたいのか」で選ぶと判断しやすくなります。以下では、この 2 つを組み合わせて使う方法までを扱います。

使用範囲全体に背景色を設定する

まずは最も基本となる、セル範囲の塗りつぶしです。対象の範囲は CellRange オブジェクトとして取得し、CellRange.Style.Color プロパティに色を代入します。

データが入力されている範囲をまとめて取得したい場合は、Worksheet.AllocatedRange プロパティが使えます。これは「値が入っているセルを囲む最小の矩形」を返すプロパティで、行数や列数が変動する帳票でも範囲指定を書き直す必要がありません。

from spire.xls import *
from spire.xls.common import *

# Workbook オブジェクトを作成
wb = Workbook()

# Excel ファイルを読み込む
wb.LoadFromFile("Sample.xlsx")

# 最初のワークシートを取得
sheet = wb.Worksheets.get_Item(0)

# ワークシートの使用範囲を取得
usedRange = sheet.AllocatedRange

# 使用範囲の背景色を淡いグリーンに設定
usedRange.Style.Color = Color.FromRgb(144, 238, 144)

# ワークブックを保存
wb.SaveToFile("WorksheetFillColor.xlsx", FileFormat.Version2016)
wb.Dispose()

Python で Excel の使用範囲全体に背景色を設定

AllocatedRange は、実際に読み込んだワークシートでは 'Sheet1'!A1:G13(13 行 × 7 列)を指しました。色は Color.FromRgb(赤, 緑, 青) のように RGB 値で指定するほか、Color.get_SteelBlue() のような定義済みの名前付き色も使えます。

ひとつ注意点があります。Style.Color を代入すると、塗りつぶしのパターン(Style.FillPattern)は 自動的に ExcelPatternType.Solid に切り替わります。塗りつぶしパターンを別途設定する必要はありません。逆に、値を書き込んでいない空のセルまで塗りたいからといって sheet.Range["A1:Z50"] のように広い範囲を指定すると、シートの使用範囲そのものが A1:G13 から A1:Z50 に膨らみます(実測)。印刷範囲や後続のデータ処理に影響するため、塗る範囲は必要な分だけにとどめておきましょう。

見出し行だけを塗り分ける

実際の帳票では、範囲全体を塗るより「見出し行だけ濃い色にする」ほうが読みやすくなります。この場合は Worksheet.Range[] で行単位の範囲を指定し、文字色と太字もあわせて設定します。

from spire.xls import *
from spire.xls.common import *

# Workbook オブジェクトを作成
wb = Workbook()

# Excel ファイルを読み込む
wb.LoadFromFile("Sample.xlsx")

# 最初のワークシートを取得
sheet = wb.Worksheets.get_Item(0)

# 見出し行(1 行目)を取得
header = sheet.Range["A1:G1"]

# 見出し行を濃いブルーで塗りつぶす
header.Style.Color = Color.get_SteelBlue()

# 文字色を白に、太字に設定
header.Style.Font.Color = Color.get_White()
header.Style.Font.IsBold = True

# ワークブックを保存
wb.SaveToFile("HeaderRowColor.xlsx", FileFormat.Version2016)
wb.Dispose()

Python で Excel の見出し行だけを塗り分け

Worksheet.Range[] は "A1:G1" のような範囲文字列のほか、sheet.Range["A5"] のように単一セルを指定することもできます。文字色は header.Style.Font.Color、太字は header.Style.Font.IsBold で設定します。背景を濃色にするときは、Color.get_White() のように明度の高い文字色を必ずセットで指定してください。既定の黒文字のままだとコントラストが足りず、かえって読みにくくなります。

ワークシート全体に背景画像を設定する

セルの塗りつぶしとは対照的に、シート全体へ画像を敷きたい場合は PageSetup クラスを使います。画像は Stream() で読み込み、Worksheet.PageSetup.BackgoundImage プロパティに渡します。

from spire.xls import *
from spire.xls.common import *

# Workbook オブジェクトを作成
wb = Workbook()

# Excel ファイルを読み込む
wb.LoadFromFile("Sample.xlsx")

# 最初のワークシートを取得
sheet = wb.Worksheets.get_Item(0)

# 背景画像を読み込む
image = Stream("background.png")

# ワークシートの背景画像として設定
sheet.PageSetup.BackgoundImage = image

# ストリームを閉じる
image.Close()

# ワークブックを保存
wb.SaveToFile("WorksheetBackgroundImage.xlsx", FileFormat.Version2016)
wb.Dispose()

Python で Excel ワークシートに背景画像を設定

このプロパティ名には注意が必要です。公式ドキュメントの説明文には BackgroundImage と書かれていますが、実際の API 名は BackgoundImage(background ではなく backgound) です。Worksheet.PageSetup.BackgoundImage 以外の綴りでは属性エラーになります。

また、Stream() で開いたファイルは使い終わったら image.Close() で閉じてください。閉じ忘れるとファイルがロックされたままになり、同じプロセス内で 2 枚目の画像を読み込もうとした時点で IO_SharingViolation_File エラーで停止します(実測)。1 つのスクリプトで複数のシートに背景を設定する場合、ここで必ずつまずきます。

なお、設定した背景画像はワークブックのパッケージ内に画像ファイルとして格納されます。テストに使った 1500 × 1000 ピクセルの PNG は、保存後のファイル内では JPEG として格納されていました。元の画像形式にかかわらず内部で再エンコードされる点は覚えておくとよいでしょう。

背景画像とセルの色を重ねる

最後に、背景画像とセルの塗りつぶしを組み合わせます。両者は描画のレイヤーが異なるため、シートに画像を敷いたうえで見出し行だけセルの色で塗ると、セルの色が画像の手前に表示されます。

from spire.xls import *
from spire.xls.common import *

# Workbook オブジェクトを作成
wb = Workbook()

# Excel ファイルを読み込む
wb.LoadFromFile("Sample.xlsx")

# 最初のワークシートを取得
sheet = wb.Worksheets.get_Item(0)

# ワークシート全体に背景画像を設定
image = Stream("background.png")
sheet.PageSetup.BackgoundImage = image
image.Close()

# 見出し行をセルの色で塗りつぶす(背景画像の手前に描画される)
header = sheet.Range["A1:G1"]
header.Style.Color = Color.get_SteelBlue()
header.Style.Font.Color = Color.get_White()
header.Style.Font.IsBold = True

# ワークブックを保存
wb.SaveToFile("HeaderOnBackgroundImage.xlsx", FileFormat.Version2016)
wb.Dispose()

Excel の背景画像とセルの塗りつぶしを重ねた結果

ただし、この重ね合わせが活きるのは画面表示のときだけです。シートの背景画像は印刷にも PDF 出力にも反映されないため、wb.SaveToFile("output.pdf", FileFormat.PDF) で PDF 化すると、見出し行の青色だけが残り、背景の画像は消えます。印刷物として配布する資料では、背景画像は「画面上の下地」と割り切り、情報を伝える要素はセルの塗りつぶしと文字で表現するのが安全です。

まとめ

本記事で扱った 4 つのパターンは、いずれも「対象を取得してから書式を代入する」という同じ形で書けます。

  1. 使用範囲全体に色を塗る — sheet.AllocatedRange.Style.Color に色を代入する
  2. 見出し行だけを強調する — sheet.Range["A1:G1"] に対して Style.Color と Style.Font を設定する
  3. シート全体に画像を敷く — sheet.PageSetup.BackgoundImage に Stream() で読み込んだ画像を渡す
  4. 両者を重ねる — 背景画像を設定したあとにセルの色を設定する

セルの背景色は印刷にも残る「情報を伝える書式」、シートの背景画像は画面表示限定の「見た目を作る装飾」です。この違いを踏まえて使い分ければ、帳票のフォーマット統一やレポートの自動生成をコード側で完結させられます。

Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。なお無償の試用版では、保存したファイルに評価用の警告シートが追加されます。ライセンスを適用するとこれも出力されなくなります。

FAQ

設定した塗りつぶしを解除するにはどうすればよいですか?

Style.Color に Color.Empty() を代入しても塗りつぶしは解除されず、FillPattern は Solid のまま残ります(実測)。解除するには Style.FillPattern に ExcelPatternType.none を設定してください。なお、この列挙体のメンバー名は None ではなく 小文字の none です。None は Python の予約語のため、そのまま書くと構文エラーになります。

シートの背景画像を削除するにはどうすればよいですか?

背景画像を解除する専用のプロパティは用意されていません。BackgoundImage に None や空の Stream() を代入すると例外(Parameter is not valid)になります(実測)。元の画像を削除したい場合は、背景を設定していない元のファイルを読み込み直して保存するか、白一色の画像を背景として設定して上書きしてください。

シートの背景画像が PDF に出力されません。

仕様どおりの動作です。シートの背景画像は Excel の画面上でのみ表示され、印刷や PDF 出力には含まれません。PDF にも背景を残したい場合は、画像をセル範囲に Pictures.Add() で配置するか、セルの塗りつぶしで代用してください。

使用範囲ではなくシート全体(すべてのセル)を塗るにはどうすればよいですか?

AllocatedRange はあくまで値が入っている範囲を返すため、値を書き込んでいないセルは含まれません。空のセルまで塗るには sheet.Range["A1:Z100"] のように明示的に範囲を指定します。ただし指定した範囲全体がシートの使用範囲として扱われるようになるため、必要以上に広く取らないようにしてください。

複数のワークシートにまとめて適用できますか?

はい。wb.Worksheets をループ処理すれば、各シートに同じ書式を適用できます。背景画像を使う場合は、シートごとに Stream() を開いて Close() する処理が必要です。

# ワークブック内のすべてのワークシートに背景色を適用
for sheet in wb.Worksheets:
    sheet.AllocatedRange.Style.Color = Color.FromRgb(144, 238, 144)
Read 6 times