C#でExcelファイルの作成し開いたままにする方法 - NPOIライブラリを使用

## はじめに
.NETでExcelファイルを操作するためには、NPOIというライブラリがよく使用されます。NPOIは、ExcelやWordなどのMicrosoft Officeファイルを読み書きできる強力なライブラリです。今回は、NPOIを使ってExcelファイルを作成し、それをユーザーのデスクトップに保存する方法になります。

## 全体の流れ
以下のコードは、NPOIを使用してExcelファイルを作成し、ユーザーデスクトップに保存する例です。

```csharp
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // データを作成します。キーはシート名、値は各シートの行データとします。
        var excelData = new Dictionary<string, List<string>>();
        excelData.Add("Sheet1", new List<string> { "Item1", "Item2", "Item3" });
        excelData.Add("Sheet2", new List<string> { "Item4", "Item5", "Item6" });
        // Excelファイルを作成し保存します。結果をコンソールに表示します。
        string result = CreateAndSaveExcel(excelData);
        Console.WriteLine(result);
    }

    public static string CreateAndSaveExcel(Dictionary<string, List<string>> excelData)
    {
        // ワークブック（Excelファイル）を新規作成します。
        IWorkbook workbook = new XSSFWorkbook();
        // 入力データの各要素（シート）に対して処理を行います。
        foreach (var item in excelData)
        {
            // 新しいシートを作成します。シート名は入力データのキーから取得します。
            ISheet sheet = workbook.CreateSheet(item.Key);
            // シートの各行に対して処理を行います。
            for (int i = 0; i < item.Value.Count; i++)
            {
                // 新しい行を作成します。
                IRow row = sheet.CreateRow(i);     
                // 行の最初のセルを作成し、値を設定します。
                ICell cell = row.CreateCell(0);
                cell.SetCellValue(item.Value[i]);
            }
        }
        // 保存するExcelファイルのパスを指定します。
        string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "ExcelOutput.xlsx");

        try
        {
            // FileStreamを使用してExcelファイルを書き込みモードで開きます。
            using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
            {
                // ワークブックの内容をExcelファイルに書き込みます。
                workbook.Write(fs);
            }
        }
        catch (Exception)
        {
            // 何らかのエラーが発生した場合は失敗メッセージを返します。
            return "Excel export failed.";
        }
        // Excelファイルを開きます。
        Process.Start(new ProcessStartInfo(fileName) { UseShellExecute = true });
        // Excelファイルの作成と保存が成功した場合は成功メッセージを返します。
        return "Excel export completed.";
    }
}
```


## データの作成
まず、Excelに書き込むためのデータを作成します。このコードでは、`Dictionary<string, List<string>>`型の変数`dataForExcel`を使用しています。ここで、`Dictionary`はキーと値のペアを格納するコレクションです。

```csharp
var dataForExcel = new Dictionary<string, List<string>>();
dataForExcel.Add("Sheet1", new List<string> { "Item1", "Item2", "Item3" });
dataForExcel.Add("Sheet2", new List<string> { "Item4", "Item5", "Item6" });
```

このコードでは、`Sheet1`と`Sheet2`という2つのシートを作成し、そのシートにそれぞれ3つのデータ(`Item1`, `Item2`, `Item3`と`Item4`, `Item5`, `Item6`)を追加しています。

## Excelファイルの作成
次に、新しいExcelワークブックを作成します。NPOIライブラリを使用してExcelワークブックを作成するためには、`XSSFWorkbook`クラスを使用します。

```csharp
IWorkbook workbook = new XSSFWorkbook();
```

そして、作成したデータを使ってExcelのシートとその中のデータを作成します。`CreateSheet`メソッドを使用してシートを作成し、`CreateRow`メソッドと`CreateCell`メソッドを使用して各行とセルを作成します。

```csharp
foreach (var item in dataForExcel)
{
    ISheet sheet = workbook.CreateSheet(item.Key);
    for (int i = 0; i < item.Value.Count; i++)
    {
        IRow row = sheet.CreateRow(i);
        ICell cell = row.CreateCell(0);
        cell.SetCellValue(item.Value[i]);
    }
}
```

## Excelファイルの保存
最後に、作成したExcelファイルをユーザーのデスクトップに保存します。これを行うためには、`FileStream`クラスを使用します。

```csharp
string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "ExcelOutput.xlsx");
```

ここでは、`Environment.GetFolderPath(Environment.SpecialFolder.Desktop)`を使用してデスクトップのパスを取得し、`Path.Combine`メソッドを使用してそのパスとファイル名を結合しています。

次に、`FileStream`を使用してファイルを作成し、ワークブックの内容を書き込みます。

```csharp
using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
    workbook.Write(fs);
}
```

最後に、作成したExcelファイルを開きます。これを行うためには、`Process.Start`メソッドを使用します。

```csharp
Process.Start(new ProcessStartInfo(fileName) { UseShellExecute = true });
```

以上が、NPOIを使用してExcelファイルを作成し、それをユーザーのデスクトップに保存する詳細な解説です。このコードを実行することで、指定したデータを含むExcelファイルがデスクトップに作成され、自動的にそのファイルが開きます。