月別の推移を行ごとに並べた表は、数字が 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) の形で順に処理できます。