チュートリアル

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

チュートリアル».NET»Spire.PDF for .NET»テキスト»C#:PDF ページ内のテキストや画像の座標を取得する方法
2026-09-30

Python で Excel のスパークラインを挿入・変更・削除する方法

月別の推移を行ごとに並べた表は、数字が 12 列も続くと「増えているのか減っているのか」が一目では分かりません。かといって行ごとにグラフを貼り付けると、シートはグラフだらけになり、表そのものが読みにくくなります。

その中間にあるのがスパークラインです。セル 1 つ分の領域に収まる小さなグラフで、表のレイアウトを崩さずに推移だけを添えられます。本記事では、Spire.XLS for Python を使用して Python で Excel のスパークラインを挿入・変更・削除する方法 を解説します。

クイックナビゲーション

準備: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 *

ここでひとつ注意点があります。 スパークラインは Excel 2010 以降で追加された機能のため、ワークブックの形式が古いままだと扱えません。Workbook() で新規作成したブックの Workbook.Version は既定で Version97to2003 になっており、その状態でスパークラインを操作しようとすると次の例外で停止します。

SpireException: Sparkline can not be supported for current excel version.

新規にブックを作る場合は、最初に Workbook.Version へ ExcelVersion.Version2016 を設定しておいてください。既存の .xlsx ファイルを読み込む場合は、そのファイルの形式が引き継がれるため通常は設定不要です。

サンプルデータを用意する

以降の操作で使う表を用意します。商品ごとに 1 行、1 月から 12 月までの数値を横に並べ、スパークラインはその右隣(N 列)に置く構成です。

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

# Workbook オブジェクトを作成
workbook = Workbook()
workbook.Version = ExcelVersion.Version2016
workbook.CreateEmptySheets(1)
sheet = workbook.Worksheets.get_Item(0)
sheet.Name = "月別売上"

# 見出しを設定
sheet.Range["A1"].Text = "2025年度 月別売上高(千円)"
sheet.Range["A2"].Text = "商品"
months = ["1月", "2月", "3月", "4月", "5月", "6月",
          "7月", "8月", "9月", "10月", "11月", "12月"]
for i, month in enumerate(months):
    sheet.Range[2, i + 2].Text = month
sheet.Range[2, 14].Text = "スパークライン"

# 商品ごとの月別数値を入力
products = [
    ("商品A", [120, 135, 150, 148, 162, 175, 190, 205, 198, 215, 230, 248]),
    ("商品B", [240, 228, 215, 210, 196, 188, 175, 168, 152, 140, 128, 115]),
    ("商品C", [150, 152, 149, 151, 150, 153, 148, 150, 151, 149, 152, 150]),
    ("商品D", [90, 210, 110, 240, 95, 260, 120, 230, 100, 250, 130, 245]),
    ("商品E", [80, 75, 110, 160, 200, 230, 215, 180, 140, 110, 95, 90]),
    ("前年同月比", [12, -8, 15, 20, -5, 18, -12, 25, 9, -3, 22, 17]),
]
for r, (label, values) in enumerate(products, start=3):
    sheet.Range[r, 1].Text = label
    for i, value in enumerate(values):
        sheet.Range[r, i + 2].NumberValue = value

# 表の書式を整える
sheet.Range["A2:N2"].Style.Color = Color.get_Black()
sheet.Range["A2:N2"].Style.Font.Color = Color.get_White()
sheet.Range["A2:N2"].Style.Font.IsBold = True
sheet.Range["A2:N2"].Style.HorizontalAlignment = HorizontalAlignType.Center
sheet.Range["A2:A8"].Style.Font.IsBold = True
sheet.Range["B3:M8"].Style.HorizontalAlignment = HorizontalAlignType.Center
sheet.Range["B3:M8"].Style.NumberFormat = "#,##0"
sheet.AutoFitColumn(1)

workbook.SaveToFile("Sample.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

ここで「1月」のような文字列を扱うときの落とし穴があります。Range.Value に "1月" を代入すると、Spire.XLS はそれを日付(2026/1/1)として解釈してしまいます。セルの表示形式を "@"(文字列)に変えてから代入しても同じでした。月名や年号のような「日付に見える文字列」をそのまま表示させたい場合は、次のように Range.Text プロパティを使ってください。

sheet.Range["B2"].Text = "1月"      # 文字列として格納される
sheet.Range["B2"].Value = "1月"     # 日付に変換されてしまう

スパークラインの 3 種類

挿入の前に、選べる種類を整理しておきます。SparklineType 列挙体には次の 3 つの値が用意されています。

SparklineType 見た目 向いているデータ
Line 折れ線 単調な増減トレンド。もっとも一般的
Column 縦棒 各期の値を個別に比較したい場合
Stacked 勝敗(正負の点) 増減・達成未達など、プラスとマイナスの 2 値

Stacked は名前こそ「積み上げ」ですが、Excel の「勝敗」スパークラインに相当します。上のサンプルでいえば「前年同月比」のように、正負のどちらかに振れたことだけを追いたい行に向いています。

スパークラインを挿入する

挿入は、ワークシートにスパークライン グループを追加し、その中にスパークラインを追加するという 2 段構えの流れになります。色はグループ単位で指定するため、同じ見た目にしたい行は同じグループにまとめると管理しやすくなります。

  • Worksheet.SparklineGroups.AddGroup() でグループを追加し、SparklineGroup.SparklineType と SparklineGroup.SparklineColor で見た目を設定する
  • SparklineGroup.Add() でスパークラインのコレクションを取得する
  • SparklineCollection.Add(データ範囲, 表示先セル) でスパークラインを配置する
from spire.xls import *
from spire.xls.common import *

# Workbook オブジェクトを作成し、スパークラインを含むファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("Sample.xlsx")

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

# 折れ線スパークライン(商品Aの行)
group1 = sheet.SparklineGroups.AddGroup()
group1.SparklineType = SparklineType.Line
group1.SparklineColor = Color.get_Orange()
group1.HighPointColor = Color.get_Red()
sparklines1 = group1.Add()
sparklines1.Add(sheet.Range["B3:M3"], sheet.Range["N3"])

# 縦棒スパークライン(商品Bの行)
group2 = sheet.SparklineGroups.AddGroup()
group2.SparklineType = SparklineType.Column
group2.SparklineColor = Color.get_BlueViolet()
group2.HighPointColor = Color.get_Red()
sparklines2 = group2.Add()
sparklines2.Add(sheet.Range["B4:M4"], sheet.Range["N4"])

# 勝敗スパークライン(前年同月比の行)
group3 = sheet.SparklineGroups.AddGroup()
group3.SparklineType = SparklineType.Stacked
group3.SparklineColor = Color.get_DarkBlue()
group3.NegativePointColor = Color.get_Red()
sparklines3 = group3.Add()
sparklines3.Add(sheet.Range["B8:M8"], sheet.Range["N8"])

# スパークラインが見えるよう列幅を調整
sheet.Columns[13].ColumnWidth = 20

workbook.SaveToFile("AddSparklines.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

Python で Excel にスパークラインを挿入

スパークラインはセルの幅に合わせて描画されるため、表示先の列幅が狭いとほとんど見えません。上のコードのように Worksheet.Columns[index].ColumnWidth である程度の幅を確保しておいてください。

SparklineGroup には、色以外にも次のようなプロパティがあります。

  • HighPointColor — 最大値の点の色
  • LowPointColor — 最小値の点の色
  • NegativePointColor — 負の値の色(Stacked でとくに有効)
  • MarkersColor — マーカーの色
  • LineWeight — 線の太さ(既定は 0.75)
  • ShowHighPoint / ShowLowPoint / ShowNegativePoint / ShowMarkers — 各ポイントを表示するかどうか

スパークラインを変更する

挿入したあとに種類や色、参照するデータ範囲を変えたい場合は、Worksheet.SparklineGroups[index] でグループを取得して設定を上書きします。参照範囲の変更だけはグループではなくスパークライン単位の操作で、SparklineCollection.RefreshRanges() メソッドを使います。

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

# Workbook オブジェクトを作成し、スパークラインを含むファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("AddSparklines.xlsx")

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

# 2 番目のスパークライングループを取得
sparklineGroup = sheet.SparklineGroups[1]

# 種類を折れ線に、色をフォレストグリーンに変更
sparklineGroup.SparklineType = SparklineType.Line
sparklineGroup.SparklineColor = Color.get_ForestGreen()

# 参照するデータ範囲を 1 月〜6 月に変更(表示先はそのまま)
sparklines = sparklineGroup[0]
sparklines.RefreshRanges(sheet.Range["B4:G4"], sheet.Range["N4"])

workbook.SaveToFile("ModifySparklines.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

Python で Excel のスパークラインを変更

SparklineGroup をインデックスで取得すると、そのグループに属するスパークラインのコレクション(SparklineCollection)も同じようにインデックスで取り出せます。上のコードでは sparklineGroup[0] が 1 本目のスパークラインにあたります。RefreshRanges() の第 2 引数には表示先セルを渡しますが、表示先を変えない場合でも省略できないため、変更前と同じセルを指定してください。

スパークラインを削除する

削除は Worksheet.SparklineGroups.Clear() メソッドで行います。引数には削除したいグループを渡します。

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

# Workbook オブジェクトを作成し、スパークラインを含むファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("AddSparklines.xlsx")

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

# 最初のスパークライングループを取得して削除
sparklineGroup = sheet.SparklineGroups[0]
sheet.SparklineGroups.Clear(sparklineGroup)

workbook.SaveToFile("RemoveSparklines.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

Python で Excel のスパークラインを削除

Clear() はグループ単位の削除なので、そのグループに複数のスパークラインが含まれていればまとめて消えます。グループの中から 1 本だけを削除する方法は、現行バージョン(16.8.2)の Python バインディングでは提供されていません。 SparklineCollection.Remove() や SparklineCollection.RemoveAt() を呼ぶと AttributeError: function 'IList_Remove' not found になります。特定の行のスパークラインだけを消したい場合は、削除したい行を含まないグループを組み直すか、対象の行だけを残したグループを作り直してください。

まとめ

本記事で扱った操作を整理します。

  • 挿入 — Worksheet.SparklineGroups.AddGroup() でグループを作り、SparklineType と SparklineColor を設定したうえで、SparklineCollection.Add(データ範囲, 表示先セル) で配置する
  • 変更 — 種類と色は SparklineGroup のプロパティを上書きし、参照範囲は SparklineCollection.RefreshRanges() で変更する
  • 削除 — Worksheet.SparklineGroups.Clear(グループ) でグループごと削除する
  • 前提条件 — スパークラインは Excel 2010 以降の機能のため、新規作成時は Workbook.Version に ExcelVersion.Version2016 を設定する。日本語の月名は Range.Text で代入する

表の数字とスパークラインを同時に生成できれば、月次レポートのような「行ごとの推移を見せたい資料」をまるごと自動化できます。

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

FAQ

スパークラインを画像に変換したら何も描画されませんでした。

仕様どおりの動作です。スパークラインは OOXML の拡張領域(x14:sparklineGroups)に格納される Excel 2010 以降の機能で、Worksheet.ToImage() によるレンダリングや PDF 出力では描画されません。保存した .xlsx を Excel で開けば問題なく表示されるため、確認は Excel 上で行ってください。

1 つのグループに複数のスパークラインを追加できますか?

はい。SparklineGroup.Add() で取得したコレクションに対して Add() を繰り返せば、同じ書式を共有するスパークラインを複数追加できます。たとえば「同じ色の折れ線を 5 行分」といった指定が 1 つのグループでまとまります。

データ範囲に空のセルが混じるとどうなりますか?

グループの SparklineGroup.EmptyCellsType に従って描画されます。SparklineEmptyCells 列挙体の値で指定し、既定値は Gaps(間隔として扱い線を途切れさせる)です。Zero にすると 0 として扱われ、Line にすると前後の値を結んで線を描画します。

スパークラインの色をポイントごとに変えられますか?

はい。HighPointColor(最大値)、LowPointColor(最小値)、NegativePointColor(負の値)、MarkerColor(マーカー)を個別に指定できます。色を反映させるには ShowHighPoint などの表示フラグを有効にしておく必要があります。

既存のファイルに含まれるスパークラインだけを一括で消せますか?

グループの数だけループして Worksheet.SparklineGroups.Clear(group) を呼んでください。Worksheet.SparklineGroups は Count プロパティを持つコレクションなので、for i in range(sheet.SparklineGroups.Count) の形で順に処理できます。

Read 6 times