月別の推移を行ごとに並べた表は、数字が 12 列も続くと「増えているのか減っているのか」が一目では分かりません。かといって行ごとにグラフを貼り付けると、シートはグラフだらけになり、表そのものが読みにくくなります。
その中間にあるのがスパークラインです。セル 1 つ分の領域に収まる小さなグラフで、表のレイアウトを崩さずに推移だけを添えられます。本記事では、Spire.XLS for Python を使用して Python で Excel のスパークラインを挿入・変更・削除する方法 を解説します。
クイックナビゲーション
- 準備:Spire.XLS for Python のインストール
- サンプルデータを用意する
- スパークラインの 3 種類
- スパークラインを挿入する
- スパークラインを変更する
- スパークラインを削除する
- まとめ
- FAQ
準備: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()

スパークラインはセルの幅に合わせて描画されるため、表示先の列幅が狭いとほとんど見えません。上のコードのように 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()

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()

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) の形で順に処理できます。






