Excel ファイルに含まれる表やグラフを画像として保存したい場面は、レポート作成や Web サイトへの掲載、プレゼンテーション資料の作成など、さまざまな業務で発生します。スクリーンショットを手動で取得する方法もありますが、ファイル数が多い場合や定期的な処理が必要な場合は、プログラムによる自動化が有効です。
この記事では、Spire.XLS for Python を使用して Excel ファイルを PNG や JPEG などの画像形式に変換する手順を、具体的なコード例とともに解説します。
Spire.XLS for Python の概要
Spire.XLS for Python は、Python 環境から Excel ファイルの読み込み、作成、編集、変換を行うためのライブラリです。.NET 向けに開発された Spire.XLS を Python から利用できるようにしたもので、以下のような操作が可能です。
- Excel ワークブックの読み込みと新規作成
- セルデータの読み取りと書き込み
- 数式や書式の設定
- グラフや画像の操作
- PDF、CSV、HTML、画像などの各種形式への変換
- Windows、Linux、macOS での動作
このライブラリには無料版と有料版があります。無料版ではシートあたりの変換可能な行数や列数に上限が設けられています。大規模なファイルを扱う場合は、事前に公式の制限事項を確認する必要があります。
環境の準備
Spire.XLS for Python は PyPI に登録されており、以下のコマンドでインストールできます。
pip install Spire.XLS
インストールが完了したら、Python スクリプト内で必要なクラスをインポートして使用します。
from spire.xls import Workbook
Excel を画像に変換する基本手順
Spire.XLS for Python で Excel を画像に変換する基本的な流れは次のとおりです。
-
Workbookオブジェクトを作成し、Excel ファイルを読み込む - ワークシートを
Worksheetオブジェクトとして取得する -
ToImageメソッドでシートを画像に変換する - 画像オブジェクトをファイルとして保存する
-
Disposeメソッドでリソースを解放する
ワークシート全体を画像に変換する
以下のコードは、Excel ファイルの先頭シートを PNG 画像として保存する例です。
from spire.xls import Workbook
# Workbook オブジェクトの作成
workbook = Workbook()
# Excel ファイルの読み込み
workbook.LoadFromFile("data.xlsx")
# 最初のワークシートを取得
worksheet = workbook.Worksheets[0]
# ワークシートを画像に変換
image = worksheet.ToImage(1, 1, worksheet.LastRow, worksheet.LastColumn)
# 画像をファイルとして保存
image.Save("output.png")
# リソースの解放
workbook.Dispose()
ToImage メソッドの引数は、変換対象のセル範囲を指定します。第 1 引数が開始行、第 2 引数が開始列、第 3 引数が終了行、第 4 引数が終了列です。行と列のインデックスは1から始まります。worksheet.LastRow と worksheet.LastColumn を使用することで、データが存在する範囲全体を指定しています。
特定のセル範囲のみを画像に変換する
シート全体ではなく、特定の範囲だけを画像として切り出したい場合は、ToImage メソッドの引数で範囲を指定します。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
worksheet = workbook.Worksheets[0]
# A1 から D10 までの範囲を画像に変換(1 行目 1 列目から 10 行目 4 列目まで)
image = worksheet.ToImage(1, 1, 10, 4)
image.Save("range_output.png")
workbook.Dispose()
すべてのワークシートを個別の画像に変換する
ワークブックに複数のシートが含まれている場合、それぞれを個別の画像ファイルとして保存するには、以下のようにループ処理を行います。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
# 全ワークシートをループ
for i in range(workbook.Worksheets.Count):
worksheet = workbook.Worksheets[i]
# シート名をファイル名に使用
safe_name = worksheet.Name.replace("/", "_").replace("\\", "_")
image = worksheet.ToImage(1, 1, worksheet.LastRow, worksheet.LastColumn)
image.Save(f"{safe_name}.png")
workbook.Dispose()
シート名にファイル名として使用できない文字(/や\など)が含まれている場合に備え、置換処理を追加しています。環境によっては、さらに他の文字(:, *, ?, ", <, >, | など)も置換対象となります。
画像変換時のオプション
画像フォーマットの指定
ToImage メソッドで生成される画像オブジェクトの Save メソッドでは、ファイル名の拡張子によって出力フォーマットが決まります。PNG、JPEG、BMP など、一般的な画像形式に対応しています。
# PNG 形式で保存
image.Save("output.png")
# JPEG 形式で保存
image.Save("output.jpg")
# BMP 形式で保存
image.Save("output.bmp")
画像解像度に関する留意点
ToImage メソッドで生成される画像の解像度は、既定では画面表示用の解像度(約 96DPI)です。高解像度の画像が必要な場合、Spire.XLS for Python の標準 API では DPI を直接指定するメソッドは提供されていません。必要に応じて、Pillow などの画像処理ライブラリで後処理を行う方法が考えられます。
from spire.xls import Workbook
from PIL import Image
workbook = Workbook()
workbook.LoadFromFile("data.xlsx")
worksheet = workbook.Worksheets[0]
# 既定の解像度で画像を生成
image = worksheet.ToImage(1, 1, worksheet.LastRow, worksheet.LastColumn)
image.Save("temp.png")
workbook.Dispose()
# Pillow で画像を開き、解像度を変更して保存
img = Image.open("temp.png")
img.save("output_highres.png", dpi=(300, 300))
この方法はライブラリ自体の機能ではなく、Python の外部ライブラリを併用したものです。
変換時の注意点
無料版の制限
Spire.XLS for Python の無料版では、1 シートあたりの変換可能な行数と列数に制限があります。公式ドキュメントによると、無料版は 1 シートあたり 200 行、30 列までのデータが対象です(バージョンによって異なる可能性があります)。この制限を超えるデータを含むシートを画像に変換する場合、範囲外の領域は出力されない、またはウォーターマークが挿入される場合があります。
フォントの依存性
画像変換時には、Excel ファイルで使用されているフォントが実行環境にインストールされている必要があります。該当フォントが存在しない場合、代替フォントで表示され、レイアウトが崩れる可能性があります。特に日本語フォント(MS P ゴシック、MS 明朝など)を使用しているファイルを Linux 環境で変換する場合は、IPA フォントなどの代替フォントを事前にインストールしておくことが推奨されます。
メモリ管理
Workbook オブジェクトは内部で .NET リソースを保持するため、処理後は Dispose メソッドでリソースを解放することが推奨されています。大量のファイルを連続処理する場合は、メモリリークを防ぐために適切なリソース解放が必要です。
グラフやオブジェクトのレンダリング
グラフ、図形、画像などのオブジェクトがシートに含まれている場合、ToImage メソッドはこれらのオブジェクトも含めてレンダリングします。ただし、複雑なグラフや 3D 効果を使用した図形については、元の表示と完全に一致しない場合があります。変換後は出力画像を確認し、必要に応じて元の Excel ファイル側で表示を調整することが推奨されます。
他のライブラリとの比較
Python で Excel を画像に変換する方法はいくつか存在します。
| 方法 | 特徴 |
|---|---|
| Spire.XLS for Python | .xls/.xlsx 両対応。シートを直接画像化できる。無料版は行数・列数に制限あり。 |
| openpyxl + Pillow | .xlsx ファイルを読み取り、Pillow で描画。セルのスタイルを自前で再現する必要がある。 |
| win32com | Windows 環境で Excel アプリケーションを自動操作。Excel のインストールが必要。高精度なレンダリングが可能。 |
| LibreOffice CLI | LibreOffice をコマンドラインから呼び出して変換。クロスプラットフォームだが、LibreOffice のインストールが必要。 |
Spire.XLS for Python は、Microsoft Office や LibreOffice のインストールが不要であり、Python スクリプトのみで処理が完結します。一方で、無料版の制限やフォントの依存性については事前に考慮する必要があります。
実用的なユースケース
以下は、複数の Excel ファイルをまとめて画像に変換するバッチ処理の例です。特定のディレクトリ内のすべての .xlsx ファイルを対象とし、各シートをPNG画像として出力します。
import os
from spire.xls import Workbook
target_dir = "./excel_files"
output_dir = "./image_output"
# 出力先ディレクトリがなければ作成
os.makedirs(output_dir, exist_ok=True)
# ディレクトリ内の全 .xlsx ファイルを処理
for filename in os.listdir(target_dir):
if filename.endswith(".xlsx"):
workbook = Workbook()
filepath = os.path.join(target_dir, filename)
workbook.LoadFromFile(filepath)
base_name = os.path.splitext(filename)[0]
# 全シートを画像に変換
for i in range(workbook.Worksheets.Count):
worksheet = workbook.Worksheets[i]
safe_name = worksheet.Name.replace("/", "_").replace("\\", "_")
image = worksheet.ToImage(1, 1, worksheet.LastRow, worksheet.LastColumn)
output_filename = f"{base_name}_{safe_name}.png"
output_path = os.path.join(output_dir, output_filename)
image.Save(output_path)
workbook.Dispose()
このスクリプトを利用することで、多数の Excel ファイルの内容を画像化し、レポートや Web コンテンツとして活用できます。
まとめ
Spire.XLS for Python を使用すると、Excel ファイルの各シートを画像ファイルとして出力できます。シート全体の変換はもちろん、特定のセル範囲の切り出しも可能であり、帳票の画像化やデータの可視化に利用できます。
導入にあたっては、無料版の行数・列数の制限や、フォントの依存性、画像解像度の仕様を事前に確認することが重要です。また、処理後は Dispose メソッドでリソースを解放することを推奨します。
用途や要件に応じて適切なツールを選択し、効率的なデータ処理を実現してください。