Aspose.Cells for Python via Java でスパークラインを画像と HTML に変換する

はじめに

スパークラインは、ワークシート内で直接トレンドを視覚化するコンパクトな手段です。Excel ユーザーはセル内でそれを確認しますが、実際にはセル外で利用したいケースが多くあります。たとえば、別のセルに静的な画像として埋め込む場合、自動送信メールに添付する場合、Web に公開する HTML レポートの一部としてレンダリングする場合などです。 Aspose.Cells はこれら両方の操作をサポートしています。Sparkline.to_image メソッドは個々のスパークラインをストリームにレンダリングし、そのバイト列を Cell.embedded_image に割り当てることで、画像をワークブックの単一セル内に保存できます。別途、HtmlSaveOptions を使用すると、ワークブック全体(スパークラインを含む)を自己完結型の HTML ファイルに変換できます。本記事では、両方のワークフローを順に説明します。

ワークフロー 1 — スパークラインを画像にレンダリングしてセルに埋め込む

このワークフローでは、サンプル値を含む小さな範囲を持つワークシートを作成し、その範囲に 3 つの異なるスパークライン グループ(折れ線、縦棒、積み上げ/勝敗)を関連付け、各グループを PNG としてレンダリングし、それらの PNG バイト列を隣接するセルに埋め込み画像として書き込みます。最終結果は、ライブスパークラインとそのレンダリングされた画像の両方を含む単一の .xlsx ファイルです。

ステップごとの手順

  1. 作業ディレクトリを定義し、ディスク上に存在することを確認します。
  2. 新しい Workbook を作成し、最初の Worksheet への参照を取得します。
  3. セル A1 から E1 までに 5 つのサンプル数値(たとえば、日次売上や気温の読み取り値など)を入力します。
  4. worksheet.sparkline_groups.add(...) を呼び出して、ワークシートに 3 つの SparklineGroup オブジェクトを追加します:
    • アンカー F1、データ範囲 A1:E1 の SparklineType.LINE グループ。
    • アンカー G1、データ範囲 A1:E1 の SparklineType.COLUMN グループ。
    • アンカー H1、データ範囲 A1:E1 の SparklineType.STACKED(勝敗)グループ。
  5. ImageOrPrintOptions インスタンスを作成し、各スパークラインが透明な PNG としてレンダリングされるように image_type を ImageType.PNG に設定します。
  6. ワークブックを output_with_sparklines.xlsx として保存します。
import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, Worksheet, CellArea, SparklineType, ImageType, ImageOrPrintOptions, Sparkline
from jpype import JClass
ByteArrayOutputStream = JClass('java.io.ByteArrayOutputStream')
# 新しいワークブックを作成し、最初のワークシートにアクセスします
workbook = Workbook()
worksheet = workbook.getWorksheets().get(0)
# セルA1:E1にサンプルデータを入力します
worksheet.getCells().get("A1").putValue(5)
worksheet.getCells().get("B1").putValue(-3)
worksheet.getCells().get("C1").putValue(8)
worksheet.getCells().get("D1").putValue(-2)
worksheet.getCells().get("E1").putValue(6)
# F1(列5、行0)にアンカーされた折れ線スパークライングループを追加します
lineArea = CellArea()
lineArea.setStartColumn(5)
lineArea.setEndColumn(5)
lineArea.setStartRow(0)
lineArea.setEndRow(0)
lineIdx = worksheet.getSparklineGroups().add(SparklineType.Line, "A1:E1", False, lineArea)
# G1(列6、行0)にアンカーされた縦棒スパークライングループを追加します
columnArea = CellArea()
columnArea.setStartColumn(6)
columnArea.setEndColumn(6)
columnArea.setStartRow(0)
columnArea.setEndRow(0)
columnIdx = worksheet.getSparklineGroups().add(SparklineType.Column, "A1:E1", False, columnArea)
# H1(列7、行0)にアンカーされた勝敗(積み上げ)スパークライングループを追加します
stackedArea = CellArea()
stackedArea.setStartColumn(7)
stackedArea.setEndColumn(7)
stackedArea.setStartRow(0)
stackedArea.setEndRow(0)
stackedIdx = worksheet.getSparklineGroups().add(SparklineType.Stacked, "A1:E1", False, stackedArea)
# PNG出力用の画像オプションを設定します
imageOptions = ImageOrPrintOptions()
imageOptions.setImageType(ImageType.Png)
# 折れ線スパークラインを画像に変換し、セルF2に埋め込みます
lineSp = worksheet.getSparklineGroups().get(lineIdx).getSparklines().get(0)
ms = ByteArrayOutputStream()
lineSp.toImage(ms, imageOptions)
worksheet.getCells().get("F2").setEmbeddedImage(ms.toByteArray())
# 縦棒スパークラインを画像に変換し、セルG2に埋め込みます
columnSp = worksheet.getSparklineGroups().get(columnIdx).getSparklines().get(0)
ms = ByteArrayOutputStream()
columnSp.toImage(ms, imageOptions)
worksheet.getCells().get("G2").setEmbeddedImage(ms.toByteArray())
# 勝敗スパークラインを画像に変換し、セルH2に埋め込みます
stackedSp = worksheet.getSparklineGroups().get(stackedIdx).getSparklines().get(0)
ms = ByteArrayOutputStream()
stackedSp.toImage(ms, imageOptions)
worksheet.getCells().get("H2").setEmbeddedImage(ms.toByteArray())
# ワークブックをディスクに保存します
workbook.save("output_with_sparklines.xlsx")
jpype.shutdownJVM()

上記のコードは、スパークラインの各ビジュアル表現が 2 つの形式で複製されたワークブックを生成します。1 行目にアンカーされたネイティブのライブスパークラインと、2 行目の隣接セルに直接埋め込まれた静的な PNG 画像の 2 つの形式で表現されます。画像がファイル自体に保存されているため、ワークブックは埋め込まれた画像参照が壊れることなく、単一の自己完結型アーティファクトとしてメール送信やアーカイブが可能です。各スパークライン グループを PNG としてレンダリングし、ByteArrayOutputStream を byte[] に変換(または Python の bytes オブジェクトを取得するために to_byte_array() を使用)して、配列を対象セルの embedded_image プロパティに割り当てます。この代入によって画像がセルの保存内容の一部になります。