PythonでExcelに画像を挿入、置換、抽出、削除する

エクセルは主に表計算データを扱うためのツールです。時には、ワークシートに視覚効果を加え、レポートの魅力を高めるために、Excelで画像を挿入、編集、管理する必要があるかもしれません。
この記事では、**Pythonを使用してExcelで画像を操作する方法について**、以下の4つの基本的な例を含めて詳しく説明します：
* [PythonでExcelに画像を挿入する](#pythonでexcelに画像を挿入する)
* [PythonでExcelの画像を置換する](#pythonでexcelの画像を置換する)
* [PythonでExcelから画像を抽出する](#pythonでexcelから画像を抽出する)
* [PythonでExcelから画像を削除](#pythonでexcelから画像を削除)

## Excelファイルを扱うためのPythonライブラリ
:pushpin: Python Excel API – [**Spire.XLS for Python**](https://www.e-iceblue.com/Introduce/xls-for-python.html)

まず、サードパーティのPythonライブラリSpire.XLS for Pythonを以下のpipコマンドでインストールします。
**`pip install Spire.XLS`**

あるいは、以下のリンクから製品パッケージをダウンロードし、ローカルパスからインストールすることもできます。

https://www.e-iceblue.com/Download/Spire-XLS-Python.html


## PythonでExcelに画像を挿入する
Spire.XLSライブラリを使用して、指定したセルに画像を挿入し、画像のサイズやその他のプロパティを設定することができます。主な手順は以下の通りです：

1\.	**`Workbook`** オブジェクトを作成し、指定されたワークシートを取得する；
2\.	**`Worksheet.Pictures.Add(int topRow, int leftColumn, Image image)`** メソッドを使用して、ワークシートの指定されたセルに画像を挿入します；
3\.	**`ExcelPicture`** クラスのプロパティを使用して、画像の幅、高さ、画像とセルの境界線の間の距離を設定します；
4\.	**`SaveToFile()`** メソッドを使用してExcelファイルを保存します。

**Pythonコード:**
```python
from spire.xls import *
from spire.xls.common import *
     
# Workbook オブジェクトの作成
workbook = Workbook()

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# 指定したセル（ここでは1行2列目、すなわちセルB1）に画像を挿入する
picture = sheet.Pictures.Add(1, 2, "sample.png")

# 画像の幅と高さを設定する
picture.Width = 120
picture.Height = 120

# 画像に合わせて列の幅と行の高さを調整する
sheet.Columns[1].ColumnWidth = 20
sheet.Rows[0].RowHeight = 110

# 画像とセルの境界線との距離を設定する
picture.LeftColumnOffset = 90
picture.TopRowOffset = 20

# ファイルの保存
workbook.SaveToFile("InsertImage.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
```
![ExcelImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/259d7117-90e9-edd7-bc45-e954baa5fa75.png)


## PythonでExcelの画像を置換する
エクセルの元画像を新しい画像に置き換えるには、以下の手順を参照してください：

1\.	Excelファイルを読み込み、指定したワークシートを取得する；
2\.	**`Worksheet.Pictures[]`** プロパティを使用して、ワークシート内の指定された画像を取得します；
3\.	新しい画像をロードし、**`ExcelPicture.Picture`** プロパティを通して指定された画像を新しい画像に置き換える；
4\.	**`SaveToFile()`** メソッドを使用して、Excel ファイルを保存します。

**Pythonコード:**
```python
from spire.xls import *
from spire.xls.common import *

# エクセル文書を読み込む
workbook = Workbook()
workbook.LoadFromFile ("InsertImage.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# ワークシートの最初の画像を取得する
excelPicture = sheet.Pictures[0]
            
#  画像を置き換える
excelPicture.Picture = Image.FromFile("pic.jpg")

# ファイルの保存
workbook.SaveToFile("ReplaceImage.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
```
![ReplaceExcelImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/36242b72-2a71-b1b4-3c37-dd3ea194a409.png)


## PythonでExcelから画像を抽出する
Spire.XLS for Python ライブラリは、Excel 文書から画像を読み取り、指定したファイルパスに保存することもできます。手順は以下の通りです：

1\.	Excelファイルを読み込み、指定したワークシートを取得する；
2\.	ワークシート内のすべての画像をループする；
3\.	**`ExcelPicture.Picture.Save()`** メソッドを呼び出して、Excelワークシートから画像を取り出す。

**Pythonコード:**
```python
from spire.xls import *
from spire.xls.common import *

# エクセル文書を読み込む
workbook = Workbook()
workbook.LoadFromFile("icons.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# ワークシート内のすべての画像を取得する
for i in range(sheet.Pictures.Count - 1, -1, -1):
    pic = sheet.Pictures[i]

    # 画像を保存する
    pic.Picture.Save("ExtractImages\\Img-{0:d}.png".format(i), ImageFormat.get_Png())

workbook.Dispose()
```
![ExtractExcelImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/f5ddc8fd-16f0-6237-9b54-de811b79308a.png)


## PythonでExcelから画像を削除
**`Worksheet.Pictures[imgIndex].Remove()`** メソッドを使用すると、指定した画像をインデックスごとに削除することができます。Excelですべての画像を削除するには、各画像を繰り返し処理して削除します。下記はサンプルコードです：
```python
from spire.xls import *
from spire.xls.common import *

# エクセル文書を読み込む
workbook = Workbook()
workbook.LoadFromFile("icons.xlsx")

# 最初のワークシートを取得する
sheet = workbook.Worksheets[0]

# ワークシート内のすべての画像を削除する
for i in range(sheet.Pictures.Count - 1, -1, -1):
    sheet.Pictures[i].Remove()

# 指定した画像を削除する
# sheet.Pictures[imgIndex].Remove()

# ファイルを保存する
workbook.SaveToFile("DeleteImages.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
```
![DeleteExcelImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/03c03eb7-7863-46a3-cde9-0bc6e8156dd7.png)


* * *
上記の例は、Pythonを使ってExcelで画像を挿入、置換、抽出、削除するスキルや、基本的な画像設定をマスターするのに役立ちます。もしPython APIを使ってExcelでできることにもっと興味があれば、以下のサイトでいくつかのデモを見ることができます：

https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html