.NETでC#を使ってExcelとDataTableのデータを相互変換

.NETフレームワークでは、C#を使ってExcelデータとDataTableの間でデータを変換することは、データ分析、レポート生成、データ移行などにおいて非常に一般的なニーズです。このプロセスでは、ExcelファイルからDataTableにデータを読み込み、.NETが提供する豊富なデータ処理機能を活用できるようにすること、またDataTableのデータをExcelにエクスポートしてデータの視覚化や共有を可能にすることが含まれます。この記事では、**C#でExcelデータとDataTable間の効率的な変換方法**を紹介します。

- **[ExcelファイルからDataTableへデータを書き出す](#excelファイルからdatatableへデータを書き出す)**
- **[DataTableからExcelファイルにデータを書き込む](#datatableからexcelファイルにデータを書き込む)**

ここで紹介する方法では、無料の[Free Spire.XLS for .NET](https://jp.e-iceblue.com/introduce/free-spire-xls-for-net.html)を使用します。NuGetコマンドは次の通りです：`PM> Install-Package FreeSpire.XLS`。

## ExcelファイルからDataTableへデータを書き出す
ライブラリの`ExportDataTable`メソッドを使用すると、指定したExcelワークシートまたはワークシート内の特定のセル範囲のデータを簡単にDataTableオブジェクトにインポートできます。特定のセル範囲を`DataTable`にエクスポートする際、`ExportTableOptions`オブジェクトを引数として使用してエクスポートオプションを設定することも可能です。例えば、数式の計算結果をエクスポートするかどうか、列名をエクスポートするかどうかを指定できます。以下は操作手順の例です：

1. 必要なモジュールをインポートします。
2. `Workbook`オブジェクトを作成し、`Workbook.LoadFromFile()`メソッドでExcelファイルを読み込みます。
3. `Workbook.Worksheets[]`プロパティを使用して対象のワークシートを取得します。
4. `ExportTableOptions`オブジェクトを作成し、プロパティを設定してエクスポートオプションを指定します。その後、`Worksheet.Range[].ExportDataTable()`メソッドを使用して指定したセル範囲をDataTableインスタンスとしてエクスポートします。または、`Worksheet.Range[].ExportDataTable()`メソッドを直接使用して、ワークシート全体をDataTableインスタンスとしてエクスポートすることもできます。
5. 結果を出力します。

**コード例**
```csharp
using Spire.Xls;
using System.Data;

namespace ExcelToDataTable
{
    class Program
    {
        static void Main(string[] args)
        {
            // Workbookのインスタンスを作成
            Workbook wb = new Workbook();

            // Excelファイルを読み込む
            wb.LoadFromFile("Sample.xlsx");

            // ワークシートを取得
            Worksheet sheet = wb.Worksheets[0];

            // ワークシートデータをDataTableにエクスポート
            //DataTable dataTable = sheet.ExportDataTable();

            // または指定したセル範囲をDataTableにエクスポート
            ExportTableOptions options = new ExportTableOptions();
            options.ComputedFormulaValue = true;
            options.ExportColumnNames = false;
            options.KeepDataFormat = false;
            options.RenameStrategy = RenameStrategy.Letter;
            DataTable dataTable = sheet.Range[1, 1, 3, 3].ExportDataTable(options);

            // DataTableの列名を出力
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                Console.Write(dataTable.Columns[i].ColumnName + "\t");
            }
            Console.WriteLine();

            // DataTableのデータ行を出力
            foreach (DataRow row in dataTable.Rows)
            {
                foreach (var item in row.ItemArray)
                {
                    Console.Write(item + "\t");
                }
                Console.WriteLine();
            }
        }
    }
}
```

結果
![ExcelファイルからDataTableへデータを書き出す](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/1ccc69bc-8ffd-bc51-1cfe-eb5788f41f85.png)

## DataTableからExcelファイルにデータを書き込む
`Worksheet.InsertDataTable(DataTable, insertHeaders: bool, firstRow: int, firstColumn: int)`メソッドを使用すると、DataTableデータを直接Excelワークシートに書き込むことができます。以下は操作手順の例です：

1. 必要なモジュールをインポートします。
2. データを定義し、それを使用して`DataTable`オブジェクトを構築します。
3. `Workbook`インスタンスを作成します。
4. `Workbook.Worksheets.Clear()`メソッドでデフォルトのワークシートを削除し、`Workbook.Worksheets.Add()`メソッドで新しいワークシートを追加します。
5. `Worksheet.InsertDataTable()`メソッドを使用してDataTableデータをワークシートに書き込みます。
6. 必要に応じてセルの書式を設定します。
7. `Workbook.SaveToFile()`メソッドを使用してExcelファイルを保存します。
8. リソースを解放します。

**コード例**
```csharp
using Spire.Xls;
using System.Data;

namespace DataTableToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // データ配列を定義し、DataTableのインスタンスを作成
            string[,] data = new string[,]
            {
                { "Product", "Quantity", "SalesAmount" },
                { "Product A", "100", "5000.0" },
                { "Product B", "150", "7500.0" },
                { "Product C", "200", "10000.0" },
                { "Product D", "120", "6000.0" },
                { "Product E", "180", "9000.0" }
            };
            DataTable dataTable = new DataTable();
            // 列数を取得
            int columnCount = data.GetLength(1);
            // 列を追加
            for (int col = 0; col < columnCount; col++)
            {
                dataTable.Columns.Add(data[0, col]);
            }
            // データ行を追加
            for (int row = 1; row < data.GetLength(0); row++)
            {
                DataRow dataRow = dataTable.NewRow();
                for (int col = 0; col < columnCount; col++)
                {
                    dataRow[col] = data[row, col];
                }
                dataTable.Rows.Add(dataRow);
            }

            // Workbookのインスタンスを作成
            Workbook workbook = new Workbook();

            // 既存のワークシートをクリアし、新しいワークシートを追加
            workbook.Worksheets.Clear();
            Worksheet sheet = workbook.Worksheets.Add("SalesReport");

            // DataTableのデータをワークシートに挿入
            sheet.InsertDataTable(dataTable, true, 1, 1);

            // 列幅を自動調整
            for (int i = 1; i < sheet.AllocatedRange.ColumnCount; i++)
            {
                sheet.AutoFitColumn(i);
            }

            // ファイルに保存
            workbook.SaveToFile("output/DataTableToExcel.xlsx", FileFormat.Version2016);
            workbook.Dispose();
        }
    }
}
```

結果
![DataTableからExcelファイルにデータを書き込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/ef281d9e-db1e-fc07-1b9a-73736f74f7f2.png)


この記事では、C#コードを使用して.NETプログラム内でExcelファイルのデータをDataTableにインポートし、またDataTableのデータをExcelファイルにエクスポートする方法について説明しました。