C#でExcelファイルを読み込み、データをDataTableとデータベースにエクスポート

Excelファイルは、表データを格納する一般的な形式であり、効率的に読み取りや情報の抽出ができることは非常に重要です。C#言語は、.NET Frameworkやさまざまなライブラリの豊富な機能を利用して、効率的なデータ操作が可能です。C#を使用してExcelファイルを読み取り、データをデータベースやDataTableに書き込んだり、他の目的に使用したりすることは、開発者にとって優れたExcelデータ処理の解決策です。

この記事では、C#を使用して**Excelファイルを読み取る方法**について説明します。以下のセクションを含みます：

- **[C#でExcelファイルを読み取るための準備](#cでexcelファイルを読み取るための準備)**
- **[C#コードでExcelファイルのデータを読み取り、テキストに書き込む方法](#cコードでexcelファイルのデータを読み取りテキストに書き込む方法)**
- **[C#コードでExcelファイルを読み取り、DataTableオブジェクトに格納する方法](#cコードでexcelファイルを読み取りdatatableオブジェクトに格納する方法)**
- **[C#コードでExcelファイルを読み取り、データベースに挿入する方法](#cコードでexcelファイルを読み取りデータベースに挿入する方法)**

この記事で使用する方法には、Excelファイル処理ライブラリの[Spire.XLS for .NET](https://jp.e-iceblue.com/download/spire-xls-for-net.html)が必要です。公式ウェブサイトからダウンロードしたり、NuGetで検索してインストールしたりすることができます。プロジェクトの管理コンソールで以下のコマンドを入力することでもインストールできます：`PM> Install-Package Spire.XLS`。

## C#でExcelファイルを読み取るための準備
Spire.XLS for .NETを使用してExcelファイルのデータを効果的に読み取り、他の場所に書き込むためには、いくつかのクラス、プロパティ、およびメソッドに精通する必要があります。以下の表には、いくつかの主要なクラス、プロパティ、およびメソッドとそれらの機能と説明がまとめられています：
| 項目 | 説明 |
| --- | --- |
| Workbook | Excelのワークブックを表し、その内容を読み取りおよび操作するメソッドを提供します。 |
| Worksheet | ワークブック内の個々のワークシートを表します。 |
| Workbook.LoadFromFile メソッド | ファイルからExcelのワークブックを読み込みます。 |
| Workbook.Worksheets プロパティ | ワークブック内のワークシートのコレクションを取得します。 |
| Worksheet.Range[] プロパティ | ワークシート内のセル範囲を取得します（インデックスは1から開始します）。 |
| CellRange.Value プロパティ | セルの値を取得または設定します。 |
| CellRange.Text プロパティ | セルの表示テキストを取得または設定します。 |

Excelファイルを読み取る典型的なワークフローは、以下の手順で構成されます：
1. **Workbook.LoadFromFile()** メソッドを使用してExcelファイルを読み込みます。
2. **Workbook.Worksheets[]** プロパティを使用してワークシートにアクセスします。
3. **Worksheet.Range[]** プロパティを使用してセルにアクセスします。
4. **CellRange.Text** プロパティを使用してセルに表示されるテキストにアクセスするか、**CellRange.Value** プロパティを使用してセルの値（テキスト、数値、数式など）にアクセスします。
5. データを取得し、データをテキストファイルやデータベースなどに書き込むか、他の必要な操作を実行します。
6. **Worksheet.ExportDataTable()** メソッドを使用してセルの値をデータテーブルにエクスポートし、DataTableオブジェクトを返します。
7. **Workbook.SaveToFile()** メソッドを使用してワークブックをサポートされている任意の形式に変換することもできます。

## C#コードでExcelファイルのデータを読み取り、テキストに書き込む方法
C#を使用してExcelファイルのデータを読み取り、テキストファイルに書き込む手順は以下の通りです：
1. 必要な名前空間をインポートします。
2. **Workbook** クラスのオブジェクトを作成し、**Workbook.LoadFromFile()** メソッドを使用してExcelファイルを読み込みます。
3. **Workbook.Worksheets[]** プロパティを使用して最初のワークシートを取得します。
4. データを書き込むためのテキストファイルを作成します。
5. 割り当てられた行と列を反復処理し、**Worksheet.Range[]** プロパティでセルにアクセスし、**CellRange.Text** プロパティを使用して各セルの表示テキストを取得し、それをテキストファイルに書き込みます。
6. リソースを解放します。

**コード例**
```c#
using Spire.Xls;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // Excelファイルをロードする
        Workbook workbook = new Workbook();
        workbook.LoadFromFile("Sample.xlsx");

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

        // 出力テキストファイルを作成する
        string outputFile = "Output.txt";
        StreamWriter writer = new StreamWriter(outputFile);

        // ワークシートの行と列を反復処理し、データをテキストファイルに書き込む
        for (int row = 1; row <= worksheet.LastRow; row++)
        {
            for (int col = 1; col <= worksheet.LastColumn; col++)
            {
                CellRange range = worksheet.Range[row, col];
                string cellValue = range.Text == null ? string.Empty : range.Text.ToString();
                writer.Write(cellValue + "\t"); // セルのデータをタブで区切って書き込む
            }
            writer.WriteLine(); // 改行を書き込む
        }

        // ライターを閉じてテキストファイルを保存する
        writer.Close();

        // リソースを解放する
        workbook.Dispose();
    }
}
```

**読み取り結果**
![C#でExcelのデータを読み取り、テキストに書き込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/9685bf89-a13a-040c-79fe-aeb7b47c19e7.png)

## C#コードでExcelファイルを読み取り、DataTableオブジェクトに格納する方法
**DataTable**は、.NET Frameworkでデータテーブルを表すオブジェクトです。データをメモリ内に格納および操作し、ソート、フィルタリング、変更、エクスポートなどの操作を実行するために使用されます。C#を使用してExcelファイルのデータを読み取り、それをDataTableオブジェクトに書き込むことで、データをさらに便利に処理できます。具体的な手順は以下の通りです：
1. 必要な名前空間をインポートします。
2. **Workbook** クラスのオブジェクトを作成し、**Workbook.LoadFromFile()** メソッドを使用してExcelファイルを読み込みます。
3. **Workbook.Worksheets[]** プロパティを使用して最初のワークシートを取得します。
4. **Worksheet.ExportDataTable()** メソッドを使用してワークシートのデータを **DataTable** オブジェクトにエクスポートします。
5. リソースを解放します。

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

namespace ExcelToAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            // Workbookクラスのオブジェクトを作成する
            Workbook workbook = new Workbook();

            // Excelファイルをロードする
            workbook.LoadFromFile("Sample.xlsx");

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

            // ワークシートのデータをDataTableオブジェクトにエクスポートする
            DataTable dataTable = worksheet.ExportDataTable();

            workbook.Dispose();
        }
    }
}
```

## C#コードでExcelファイルを読み取り、データベースに挿入する方法
この例では、C#コードを使用してExcelのワークシートデータをAccessデータベースに書き込む方法を示しています。この方法には、System.Data.OleDbの名前空間も必要です。もし使用している.NET Frameworkに含まれていない場合は、以下のコードをPackage Management Consoleに入力してインストールすることができます：`Install-Package System.Data.OleDb`。

Excelファイルを読み取り、データベースに挿入する手順は以下の通りです：
1. 必要な名前空間をインポートします。
2. **Workbook** クラスのオブジェクトを作成し、**Workbook.LoadFromFile()** メソッドを使用してExcelファイルを読み込みます。
3. **Workbook.Worksheets[]** プロパティを使用して最初のワークシートを取得します。
4. **Worksheet.Name** プロパティにアクセスして、ワークシートの名前を表名として取得します。
5. **Worksheet.Rows[]** プロパティを使用して最初の行の **CellRange** オブジェクトにアクセスし、各列の値を文字列配列に格納します。これは列名として使用されます。
6. **OleDbConnection** を使用してAccessデータベースに接続し、接続文字列とデータベースファイルのパスを指定します。
7. テーブルを作成するためのSQLクエリ文字列を動的に生成し、テーブル名、列名、データ型を含めます。
8. **OleDbCommand** オブジェクトと **ExecuteNonQuery** メソッドを使用してテーブルの作成クエリを実行します。
9. Excelのワークシートの各行を反復処理（2行目から開始）し、パラメータ化されたクエリを構築して、各行のデータをAccessデータベースのテーブルに挿入します。
10. データベース接続を閉じ、リソースを解放します。

**コード例**
```c#
using Spire.Xls;
using System.Data.OleDb;

class Program
{
    static void Main(string[] args)
    {
        // Excelファイルのパスを設定する
        string excelFilePath = "Sample.xlsx";
        // Accessデータベースファイルのパスを設定する
        string accessDbFilePath = "Sample.accdb";

        // Excelファイルをロードする
        Workbook workbook = new Workbook();
        workbook.LoadFromFile(excelFilePath);

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

        // ワークシート名をテーブル名として使用する
        string tableName = worksheet.Name;

        // 最初の行を列名として取得する
        CellRange headerRange = worksheet.Rows[0];
        string[] columnNames = new string[headerRange.Columns.Length];
        for (int i = 0; i < headerRange.Columns.Length; i++)
        {
            columnNames[i] = headerRange.Columns[i].Value.Replace(" ", "_");
        }

        // Accessデータベースに接続する
        string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={accessDbFilePath};Persist Security Info=False;";
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            connection.Open();

            // テーブルを作成する
            string createTableQuery = $"CREATE TABLE [{tableName}] ({string.Join(", ", columnNames.Select(c => $"[{c}] Memo"))})";
            using (OleDbCommand createTableCommand = new OleDbCommand(createTableQuery, connection))
            {
                createTableCommand.ExecuteNonQuery();
            }

            // データを挿入する
            string insertQuery = $"INSERT INTO [{tableName}] ({string.Join(", ", columnNames.Select(c => $"[{c}]"))}) VALUES ({string.Join(", ", columnNames.Select(c => $"@{c}"))})";
            using (OleDbCommand insertCommand = new OleDbCommand(insertQuery, connection))
            {
                foreach (CellRange row in worksheet.Rows.Cast().Skip(1))
                {
                    for (int i = 0; i < row.Columns.Length; i++)
                    {
                        insertCommand.Parameters.AddWithValue($"@{columnNames[i]}", row.Columns[i].Value);
                    }

                    insertCommand.ExecuteNonQuery();
                    insertCommand.Parameters.Clear();
                }
            }

            connection.Close();
            workbook.Dispose();
        }
    }
}
```

**読み取り書き込む結果**
![C#でExcelファイルを読み取り、データベースに挿入](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0216146e-dc6c-ed7f-ce6e-b25e5cd3b6d5.png)

本文では、C#を使用してExcelファイルを読み取り、さまざまな目的に使用する方法を紹介しました。Spire.XLS for .NETの強力な機能を活用することで、開発者はExcelデータを効率的に処理し、さまざまな形式でエクスポートし、データ駆動型のアプリケーションを強化することができます。本文では、ステップバイステップのガイド、コードの例、および処理結果のグラフィカルな表示が提供されています。使用中に問題が発生した場合は、[Spire.XLSフォーラム](https://www.e-iceblue.com/forum/spire-xls-f4.html)で技術サポートを受けることができます。