C#でExcelの画像を追加、置換、抽出、削除する

Excelにデータ関連の画像を挿入することで、重要なデータや情報をより視覚的な方法で表示し、文書をより美しく見せることができます。さらに、情報の正確性を確保するために既存の画像を更新したり、アーカイブやバックアップ、他のプロジェクトでの再利用のために画像をExcelに別途保存したりする必要がある場合もあります。
この記事では、C#を使用した.NETプログラムで、**Excelに画像を挿入したり、Excelから画像を置換、抽出、削除する方法**について説明します。
* [C#でExcelに画像を挿入する](#cでexcelに画像を挿入する) 
* [C# で Excel の画像を置換する](#c-で-excel-の画像を置換する) 
* [C# でエクセルから画像を抽出](#c-でエクセルから画像を抽出) 
* [C#でExcelから画像を削除する]()

## 無料の.NET Excelライブラリ
この記事は、Visual > Studio > NuGetパッケージマネージャで 「FreeSpire.XLS 」を検索することでインストールできる無料のライブラリ[**Free Spire.XLS for .NET**](https://www.e-iceblue.com/Introduce/free-xls-component.html)を必要とします。または、以下のリンクから製品パッケージをダウンロードし、dllを参照として手動で追加することもできます。

https://www.e-iceblue.com/Download/download-excel-for-net-free.html


## C#でExcelに画像を挿入する
Free Spire.XLS ライブラリは **`Worksheet.Pictures.Add(int topRow, int leftColumn, Image image)`** メソッドを提供し、ワークシートの指定されたセルに画像を挿入し、**`ExcelPicture`** オブジェクトを返します。そして、**`ExcelPicture`** クラスのプロパティを使用して、幅、高さ、セルの境界からの距離などを設定することができます。
```csharp
using Spire.Xls;

namespace InsertImageInExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // エクセルのワークブックを作成する
            Workbook workbook = new Workbook();

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

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

            // 画像の幅と高さを設定する
            pic.Width = 120;
            pic.Height = 120;

            // 画像位置の列幅と行の高さを調整する
            sheet.Columns[1].ColumnWidth = 20;
            sheet.Rows[0].RowHeight = 110;

            // セルの境界線と画像の間の距離を設定する
            pic.LeftColumnOffset = 90;
            pic.TopRowOffset = 20;

            // 結果ファイルの保存
            workbook.SaveToFile("InsertImage.xlsx", ExcelVersion.Version2016);
        }
    }
}
```
![AddExcelImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/7fb7a88a-c149-4087-8467-3217bf76b1f4.png)


## C# で Excel の画像を置換する 
Excelで画像を差し替えるには、まずワークシートで指定されている画像を **`Worksheet.Pictures[index]`** プロパティで取得し、新しい画像を読み込んでExcelPictureのPictureプロパティに代入して画像の差し替えを完了させます。
```csharp
using Spire.Xls;
using Spire.Xls.Collections;
using System.Drawing;

namespace ReplacePictureinExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // エクセル文書を読み込む
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("InsertImage.xlsx");

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

            // ワークシートの最初の画像を取得する
            ExcelPicture pic = sheet.Pictures[0];

            //画像を置き換える
            pic.Picture = Image.FromFile("pic.jpg");

            // 結果ファイルの保存
            workbook.SaveToFile("ReplaceImage.xlsx", ExcelVersion.Version2016);
        }
    }
}
```
![ReplaceExcelImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/fe66bec8-e1b2-4c31-9de7-48cf05798270.png)


## C# でエクセルから画像を抽出 
Excelから画像を抽出するには、まずワークシート内のすべての画像を繰り返し処理し、**`ExcelPicture.Picture.Save()`** メソッドを使用して各画像を指定されたファイルパスに保存する必要があります。
```csharp
using Spire.Xls;

namespace ExtractImages
{
    class Program
    {
        static void Main(string[] args)
        {
            // エクセル文書を読み込む
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("Logos.xlsx");

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

            // ワークシート内のすべての画像を反復処理する
            for (int i = sheet.Pictures.Count - 1; i >= 0; i--)
            {
                // 画像を抽出し、指定したパスに保存する
                ExcelPicture picture = sheet.Pictures[i];
                picture.Picture.Save(string.Format("ExtractImages\\Img-{0}.png", i));
            }
        }
    }
}
```


## C#でExcelから画像を削除する
Excelで無関係な画像や間違った画像を削除するには、 **`Worksheet.Pictures[index].Remove()`** メソッドを使用します。すべての画像を削除するには、各画像を繰り返し処理して1枚ずつ削除します。
```csharp
using Spire.Xls;

namespace DeleteImages
{
    class Program
    {
        static void Main(string[] args)
        {
            // エクセル文書を読み込む
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("Logos.xlsx");

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

            // 各画像を繰り返し、削除する
            for (int i = sheet.Pictures.Count - 1; i >= 0; i--)
            {
                sheet.Pictures[i].Remove();
            }

            // 結果ファイルの保存
            workbook.SaveToFile("DeleteImage.xlsx", ExcelVersion.Version2016);
        }
    }
}
```
![DeleteExcelImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/32767f10-bac6-4159-b7bf-8c4d2c5fc648.png)


フリーライブラリ Free Spire.XLS for .NET はエクセルのワークシートで画像を操作するだけでなく、図形、チャート、ハイパーリンク、透かしなど多くの要素の操作もサポートしています。詳しい機能についてはチュートリアルを参照してください：

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