Excel の表を画像にしておくと、Excel を持っていない相手への共有、プレゼン資料への貼り付け、Web ページへの掲載がぐっと楽になります。帳票のプレビュー画像を生成したり、特定の表だけをサムネイル化したりする用途でも、画像化はよく使われる処理です。
本記事では、Spire.XLS for Python の Worksheet.ToImage() を使って、Excel のシートを PNG 画像に変換する方法を紹介します。シート全体をそのまま画像にする基本形、余白をなくして表の外周で切り取る方法、指定したセル範囲だけを画像にする方法を、変換前後の比較とともに確認していきます。
クイックナビゲーション
- Excel を画像にする 3 つの方法
- 実行環境とサンプルワークブック
- シート全体を画像に変換する
- 余白のない画像に変換する
- 指定した範囲だけを画像にする
- 複数のシートをまとめて画像にする
- 画像の保存形式とサイズ
- まとめ
- FAQ
1. Excel を画像にする 3 つの方法
Spire.XLS for Python では、用途に応じて次の 3 通りの画像化ができます。
| 方法 | 出力される範囲 | 向いている用途 |
|---|---|---|
| シート全体を変換 | シートの使用範囲 | 表全体を 1 枚の画像にする |
| 余白を 0 にして変換 | 表の外周ぴったり | Web や資料に余白なく貼る |
| セル範囲を指定して変換 | 指定した行・列のみ | 特定の表や明細だけを切り出す |
いずれも Worksheet.ToImage() で画像ストリームを取得し、Save() で PNG ファイルとして保存します。画像サイズは、表の列幅・行の高さ・セルの内容に応じて決まります。
2. 実行環境とサンプルワークブック
ライブラリのインストール
pip install spire.xls
軽量な処理には、Free Spire.XLS for Python も利用できます。
pip install spire.xls.free
スクリプトでは、必要なクラスを読み込みます。
from spire.xls import Workbook
サンプルワークブック
今回は、12 商品の売上をまとめた 売上レポート.xlsx を使います。シート名は「商品別売上」で、タイトル行、見出し行、12 行の明細、合計行で構成されています。
| 列 | 内容 | 例 |
|---|---|---|
| A | 商品コード | A-101 |
| B | 商品名 | ノートPC |
| C | 数量 | 12 |
| D | 単価 | ¥128,000 |
| E | 金額 | ¥1,536,000 |
表全体は A1:E16 の範囲にあり、3 行目が見出し、8〜12 行目が「USBメモリ」から「ヘッドセット」までの 5 商品です。後の範囲指定では、この 5 商品だけを画像にします。
3. シート全体を画像に変換する
まず、シートの使用範囲をまるごと画像にします。sheet.FirstRow / FirstColumn / LastRow / LastColumn を使うと、データが入っている範囲を自動で取得できます。
import os
from spire.xls import Workbook
os.makedirs("output", exist_ok=True)
workbook = Workbook()
workbook.LoadFromFile("売上レポート.xlsx")
sheet = workbook.Worksheets[0]
image = sheet.ToImage(sheet.FirstRow, sheet.FirstColumn, sheet.LastRow, sheet.LastColumn)
image.Save("output/SheetToImage.png")
image.Dispose()
workbook.Dispose()
print("保存しました: output/SheetToImage.png")
print("ファイルサイズ:", os.path.getsize("output/SheetToImage.png"), "bytes")
ToImage() の引数は、開始行・開始列・終了行・終了列です。行と列はいずれも 1 始まりで、FirstRow などのプロパティを使えばシートの使用範囲をそのまま渡せます。
変換前の Excel シートと、変換後の PNG を並べると次のようになります。

このスクリプトを excel_to_image.py として保存して実行すると、保存したファイル名とサイズが表示されます。

既定のページ設定では、表の周囲にページ余白が入った状態で画像が出力されます。資料にそのまま貼るならこの余白が余白として機能しますが、表だけを切り出したい場合は次の節の設定を使います。
4. 余白のない画像に変換する
表の外周ぴったりの画像にしたい場合は、PageSetup の余白を 0 に設定してから ToImage() を呼び出します。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("売上レポート.xlsx")
sheet = workbook.Worksheets[0]
sheet.PageSetup.LeftMargin = 0
sheet.PageSetup.RightMargin = 0
sheet.PageSetup.TopMargin = 0
sheet.PageSetup.BottomMargin = 0
image = sheet.ToImage(sheet.FirstRow, sheet.FirstColumn, sheet.LastRow, sheet.LastColumn)
image.Save("output/SheetToImageWithoutMargins.png")
image.Dispose()
workbook.Dispose()
余白ありの画像と、余白を 0 に設定した画像を比べると、次のように仕上がりが変わります。

余白を 0 にすると、表の罫線のすぐ外側で画像が切り取られます。Web ページのサムネイルや、スライドに表をぴったり配置したい場面に向いています。
5. 指定した範囲だけを画像にする
シート全体ではなく、特定の表や明細だけを画像にしたい場合は、ToImage() に行と列の範囲を直接指定します。
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("売上レポート.xlsx")
sheet = workbook.Worksheets[0]
image = sheet.ToImage(8, 2, 12, 5)
image.Save("output/CellRangeToImage.png")
image.Dispose()
workbook.Dispose()
この例では、8〜12 行目、2〜5 列目(B〜E 列)を指定しています。商品名・数量・単価・金額の 4 列だけを、5 商品分切り出した画像になります。

範囲は 1 始まりの行番号・列番号で指定します。上の画像のように、Excel 側で対象範囲を選択してから ToImage() の引数を決めると、指定漏れを防げます。見出し行を含めたい場合は開始行を 3 に、合計行まで含めたい場合は終了行を 16 に変更します。
6. 複数のシートをまとめて画像にする
シートが複数あるブックでは、シートの枚数だけループして画像を保存します。保存ファイル名にシート名を使うと、どのシートの画像か分かりやすくなります。
import os
from spire.xls import Workbook
os.makedirs("output/sheets", exist_ok=True)
workbook = Workbook()
workbook.LoadFromFile("売上レポート.xlsx")
for i in range(workbook.Worksheets.Count):
sheet = workbook.Worksheets.get_Item(i)
image = sheet.ToImage(sheet.FirstRow, sheet.FirstColumn, sheet.LastRow, sheet.LastColumn)
path = os.path.join("output", "sheets", f"{sheet.Name}.png")
image.Save(path)
image.Dispose()
print(f"{sheet.Name} → {path}")
workbook.Dispose()
Worksheets.get_Item(i) で i 番目のシートを取得し、sheet.Name をファイル名に使います。シートごとに余白や変換範囲を変えたい場合は、ループの中で PageSetup や ToImage() の引数を調整します。
7. 画像の保存形式とサイズ
ToImage() が返すのは画像ストリームで、Save() にファイルパスを渡すと PNG 画像として保存されます。PNG は可逆圧縮のため、表の細い罫線や小さな文字もにじみにくく、帳票の画像化に適しています。
画像の大きさは、変換する範囲の列幅・行の高さに応じて決まります。シート全体を変換した場合と、5 商品だけを切り出した場合では、次のようにサイズが変わります。
| 変換範囲 | 画像サイズ(例) |
|---|---|
| シート全体(余白あり) | 686 × 501 px |
| シート全体(余白なし) | 542 × 309 px |
| B8:E12 の範囲 | 578 × 279 px |
用途に合わせて範囲を選ぶことで、資料向けの大きな画像からサムネイル向けの小さな画像まで出力できます。
まとめ
ここまで、Excel の表を PNG 画像にする 3 つの方法を、変換結果とともに確認してきました。
- シート全体 —
sheet.ToImage(sheet.FirstRow, sheet.FirstColumn, sheet.LastRow, sheet.LastColumn)で使用範囲をそのまま画像にします。 - 余白なし —
PageSetupの上下左右の余白を 0 にしてから変換すると、表の外周で切り取られます。 - 範囲指定 —
sheet.ToImage(開始行, 開始列, 終了行, 終了列)で、特定の表や明細だけを画像にできます。
いずれも Save() で PNG として保存でき、画像ストリームは Dispose() で解放します。シート全体・余白なし・範囲指定を使い分けると、資料用の大きな画像からサムネイル用の小さな画像まで、同じコードで対応できます。
Excel を PDF に変換する方法は Python で Excel を PDF に変換する方法 で、シートの背景画像を設定する方法は Python で Excel ワークシートの背景色と背景画像を設定する方法 で解説しています。
Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。
9. FAQ
Microsoft Excel をインストールせずに Excel を画像に変換できますか?
Excel がインストールされていない環境でも、Python スクリプトだけで .xlsx を読み込み、PNG 画像として保存できます。
複数のシートを一度に画像にするにはどうすればよいですか?
シートの枚数だけループし、各シートに対して ToImage() と Save() を呼び出します。保存ファイル名にシート名を含めると、どのシートの画像か分かりやすくなります。コード例は複数のシートをまとめて画像にするで紹介しています。
余白をなくすにはどうすればよいですか?
sheet.PageSetup の LeftMargin / RightMargin / TopMargin / BottomMargin をすべて 0 に設定してから ToImage() を呼び出します。
特定の行や列だけを画像にできますか?
はい。ToImage(開始行, 開始列, 終了行, 終了列) のように範囲を指定します。行番号・列番号は 1 始まりです。
画像はどの形式で保存されますか?
Save() で保存される画像は PNG 形式です。表の罫線や文字がにじみにくく、Web ページや資料にそのまま利用できます。
画像のサイズを変更できますか?
画像サイズは変換する範囲の列幅・行の高さに応じて決まります。広い範囲を指定すると大きな画像に、狭い範囲を指定すると小さな画像になります。






