.NETでC#によるExcelデータのデータベースへのインポート

Excelファイルのデータをデータベースにインポートすることは、データ処理の効率と正確性を向上させるだけでなく、データ分析や意思決定プロセスを大きく促進します。特に企業アプリケーションにおいて、Excelはデータ入力や初期整理のツールとして広く利用されていますが、複雑なクエリ、大規模なデータ管理、部門間のデータ共有に関しては限界があります。このプロセスを.NETプラットフォーム上でC#を使って実現することで、強力なデータ操作能力や豊富なライブラリを活用し、データを**ExcelからSQLiteなどのリレーショナルデータベースへシームレスに移行**できます。これにより、効率的なデータ管理、強化されたデータセキュリティ、さらなるパフォーマンス最適化が実現し、データマイニングやビジネスインテリジェンス分析のための堅実な基盤を築くことができます。

本記事では、.NETプラットフォームでC#を使用して**Excelファイルのデータをデータベースにインポートする方法**について説明します。

- **[ExcelデータをSQLiteデータベースにインポートする方法](#excelデータをsqliteデータベースにインポートする方法)**
- **[ExcelデータをAccessデータベースにインポートする方法](#excelデータをaccessデータベースにインポートする方法)**

ここで使用する手法には、無料の[Free Spire.XLS for .NET](https://jp.e-iceblue.com/introduce/free-spire-xls-for-net.html)（NuGetパッケージ：`PM> Install-Package FreeSpire.XLS`）およびSystem.Data.SQLite（NuGetパッケージ：`PM> Install-Package System.Data.SQLite`）を利用します。

---

## ExcelデータをSQLiteデータベースにインポートする方法

Free Spire.XLS for .NETの`Workbook.LoadFromFile`メソッドを使ってExcelファイルを読み込み、`CellRange.Value`を用いてセルデータを取得します。このデータを`System.Data.SQLite`モジュールを使用してSQLiteデータベースに書き込むことで、Excelデータのインポートを実現します。

以下に具体的な操作手順とC#コード例を紹介します。

### 操作手順

1. SQLiteデータベースファイルのパスを`Sample.db`、Excelファイルの出力先パスを`output/DatabaseToExcel.xlsx`に設定します。
2. `Workbook`インスタンスを新規作成し、Excelワークブックを表します。デフォルトのワークシートは削除します。
3. `SQLiteConnection`を使ってSQLiteデータベースに新たな接続を作成し、接続を開きます。
4. データベース内のすべてのテーブル名を`GetSchema("Tables")`メソッドで取得し、`DataTable`オブジェクトに格納します。
5. 各テーブル名を順に処理し、以下を実行します：  
   - 各テーブルごとに新しいワークシートをワークブックに追加し、ワークシート名をテーブル名に設定します。
6. SQLクエリを構築してテーブル内の全データを取得し、`SQLiteCommand`で実行します。
7. `SQLiteDataReader`でクエリ結果を読み取り、以下を実行します：  
   - 列名を取得し、新しいワークシートの1行目に書き込みます。
   - タイトル行（1行目）のフォントを太字でサイズ12に設定します。
8. データ行を順に処理し、各データを対応するセルに書き込みます。各列の幅を自動調整し、データ行のフォントサイズを11に設定します。
9. SQLiteデータベースとの接続を閉じます。
10. 作成したワークブックを保存し、使用していた`workbook`オブジェクトのリソースを解放します。

---

**C#コード例：**

```csharp
using System.Data.SQLite;
using Spire.Xls;

namespace ExcelToSQLite
{
    class Program
    {
        static void Main(string[] args)
        {
            string excelFilePath = "G:/Documents/Sample37.xlsx"; // Excelファイルのパス
            string sqliteFilePath = "output/Database.db"; // SQLiteデータベースのパス

            Workbook workbook = new Workbook();
            workbook.LoadFromFile(excelFilePath);

            if (!File.Exists(sqliteFilePath))
            {
                SQLiteConnection.CreateFile(sqliteFilePath);
                Console.WriteLine("新しいSQLiteデータベースファイルを作成しました: output.db");
            }

            using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;"))
            {
                connection.Open();

                foreach (Worksheet sheet in workbook.Worksheets)
                {
                    string tableName = sheet.Name;
                    var columns = sheet.Rows[0].CellList;
                    string createTableQuery = $"CREATE TABLE IF NOT EXISTS [{tableName}] (";

                    foreach (var column in columns)
                    {
                        createTableQuery += $"[{column.Value}] TEXT,";
                    }
                    createTableQuery = createTableQuery.TrimEnd(',') + ");";

                    using (SQLiteCommand createTableCommand = new SQLiteCommand(createTableQuery, connection))
                    {
                        createTableCommand.ExecuteNonQuery();
                    }

                    for (int i = 1; i < sheet.Rows.Length; i++)
                    {
                        var row = sheet.Rows[i];
                        string insertQuery = $"INSERT INTO [{tableName}] VALUES (";
                        foreach (var cell in row.CellList)
                        {
                            insertQuery += $"'{cell.Value?.Replace("'", "''")}',";
                        }
                        insertQuery = insertQuery.TrimEnd(',') + ");";

                        using (SQLiteCommand insertCommand = new SQLiteCommand(insertQuery, connection))
                        {
                            insertCommand.ExecuteNonQuery();
                        }
                    }
                }

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

            Console.WriteLine("ExcelデータをSQLiteデータベースに正常に書き込みました！");
        }
    }
}
```

結果
![ExcelデータをSQLiteデータベースにインポートする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0b52f5c3-ff14-9227-1b9a-210f09405dcf.png)

---

## ExcelデータをAccessデータベースにインポートする方法

Accessデータベースにデータを書き込む際には、`System.Data.OleDb`モジュールを使用します。以下に、具体的な操作手順とC#コード例を示します。

### 操作手順

1. Excelファイルのパスを`Sample.xlsx`、Accessデータベースファイルのパスを`output/Database.accdb`に設定します。
2. `Workbook`クラスを使用して、指定されたExcelファイルを開き、メモリ上にロードします。
3. Accessデータベースへの接続文字列を作成します。
4. Accessデータベースファイルが存在するかを確認します。存在しない場合は、ユーザーにファイル作成を促し、プログラムを終了します。
5. 新しい`OleDbConnection`オブジェクトを作成し、Accessデータベースへの接続を開きます。
6. Excelワークブック内の各ワークシートを順に処理します：
   - 現在のワークシート名を取得し、それを新しいテーブル名として使用します。
7. ワークシートの最初の行から列名を取得し、すべての列をテキスト型（TEXT）として扱うSQLクエリを構築します。
8. 各ワークシートに対して以下の操作を実行します：
   - `CREATE TABLE` SQL文を使用して新しいテーブルを作成します。
9. 各ワークシート内のすべてのデータ行（1行目は列名を含むためスキップ）について：
   - `INSERT INTO` SQL文を作成し、データ行を挿入します。この際、SQLインジェクション対策として、シングルクォートをエスケープします。
10. `INSERT INTO`文を実行して、データをAccessデータベース内の該当テーブルに挿入します。
11. あるワークシートの処理中にエラーが発生した場合、例外をキャッチしてエラーメッセージを表示し、次のワークシートの処理を継続します。
12. Accessデータベースとの接続を閉じ、`workbook`オブジェクトが使用していたリソースを解放します。

---

**C#コード例：**

```csharp
using System.Data.OleDb;
using Spire.Xls;

namespace ExcelToAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excelファイルのパス
            string excelFilePath = "G:/Documents/Sample37.xlsx";

            // Accessデータベースのパス
            string accessDbPath = "output/Database.accdb";

            // Excelファイルを開く
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(excelFilePath);

            // Accessデータベースへの接続文字列
            string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={accessDbPath};Persist Security Info=False;";

            // Accessデータベースファイルの存在確認
            if (!System.IO.File.Exists(accessDbPath))
            {
                Console.WriteLine("Accessデータベースファイルを先に作成してください。");
                return;
            }

            // OleDb接続を作成
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();

                // 各ワークシートを処理
                foreach (Worksheet sheet in workbook.Worksheets)
                {
                    string tableName = sheet.Name;
                    var columns = sheet.Rows[0].CellList;
                    string createTableQuery = $"CREATE TABLE [{tableName}] (";

                    foreach (var column in columns)
                    {
                        createTableQuery += $"[{column.Value}] TEXT,"; // 全ての列をTEXT型と仮定
                    }
                    createTableQuery = createTableQuery.TrimEnd(',') + ");";

                    try
                    {
                        // 新しいテーブルを作成
                        using (OleDbCommand createTableCommand = new OleDbCommand(createTableQuery, connection))
                        {
                            createTableCommand.ExecuteNonQuery();
                        }

                        // データを挿入
                        for (int i = 1; i < sheet.Rows.Length; i++) // 1行目はスキップ
                        {
                            var row = sheet.Rows[i];
                            string insertQuery = $"INSERT INTO [{tableName}] VALUES (";
                            foreach (var cell in row.CellList)
                            {
                                insertQuery += $"'{cell.Value?.Replace("'", "''")}',"; // シングルクォートをエスケープ
                            }
                            insertQuery = insertQuery.TrimEnd(',') + ");";

                            using (OleDbCommand insertCommand = new OleDbCommand(insertQuery, connection))
                            {
                                insertCommand.ExecuteNonQuery();
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"ワークシート {sheet.Name} の処理中にエラーが発生しました：{ex.Message}");
                    }
                }

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

            Console.WriteLine("ExcelデータをAccessデータベースに正常に書き込みました！");
        }
    }
}
```

結果
![ExcelデータをAccessデータベースにインポートする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0ddf93d8-2f5e-3c53-17be-239e199652cc.png)

---

このようにして、.NETプラットフォーム上でC#を使用してExcelデータをSQLiteまたはAccessデータベースに効率的にインポートできます。これにより、データ管理が容易になり、データ分析や意思決定の精度が向上します。