C#でデータベースをExcelファイルにエクスポートする（.NET）

企業のビジネスが成長し、複雑さが増す中で、データの効果的な分析、共有、および報告が重要になります。Excelは広く使われているデータ処理ツールであり、その強力な計算機能、視覚化オプション、さまざまなデータ分析ツールとの互換性により、データベースからのデータエクスポートの理想的な選択肢です。C#プログラミング言語の強力な機能と、豊富な.NETライブラリのサポートを活用することで、開発者は**データベースからExcelファイルへのデータ移行**を効率的に行い、特定のビジネスロジックに基づいてエクスポートプロセスをカスタマイズできます。これにより、データの正確性と完全性を確保し、ユーザーエクスペリエンスを向上させ、さまざまなユーザーの報告要求に対応できます。

本記事では、.NETプラットフォームで**C#コードを使用してデータベースのデータをExcelファイルにエクスポートする方法**を紹介します。

- **[SQLiteデータベースをExcelファイルにエクスポート](#sqliteデータベースをexcelファイルにエクスポート)**
- **[AccessデータベースをExcelファイルにエクスポート](#accessデータベースをexcelファイルにエクスポート)**


本記事で使用する方法には、無料の[Free Spire.XLS for .NET](https://jp.e-iceblue.com/introduce/free-spire-xls-for-net.html)と、System.Data.SQLiteおよびSystem.Data.OleDbが必要です。NuGetパッケージは以下のコマンドでインストールできます：
```
PM> Install-Package FreeSpire.XLS
PM> Install-Package System.Data.SQLite
PM> Install-Package System.Data.OleDb
```

## SQLiteデータベースをExcelファイルにエクスポート
`System.Data.SQLite`モジュールを使用すると、SQLiteデータベースファイルから直接データを読み取ることができます。データを読み取った後、Free Spire.XLS for .NETを使用してExcelファイルを作成し、そのデータをExcelに書き込むことができます。以下はその手順とコード例です：

1. **ファイルパスの定義**
   - SQLiteデータベースファイルのパスを`Sample.db`に設定。
   - Excel出力ファイルのパスを`output/DatabaseToExcel.xlsx`に設定。

2. **Excelワークブックのインスタンス作成**
   - 新しい`Workbook`インスタンスを作成して、エクスポートするExcelファイルを表します。
   - デフォルトで含まれているワークシートを削除して、ワークブックを空にします。

3. **SQLite接続の確立**
   - `SQLiteConnection`クラスを使用して、SQLiteデータベースへの新しい接続を作成し、データソースとバージョン番号を指定して接続文字列を初期化します。
   - SQLiteデータベースへの接続を開きます。

4. **データベース内のすべてのテーブル名を取得**
   - `GetSchema("Tables")`メソッドを呼び出して、データベース内のすべてのテーブル名を取得し、その結果を`DataTable`オブジェクトに格納します。

5. **各テーブルを処理**
   - `DataTable`オブジェクト内の各行を繰り返し、テーブル名を抽出します。
   - 各テーブルに対して、Excelワークブックに新しいワークシートを追加し、そのワークシートの名前をテーブル名にします。

6. **テーブルデータを読み取り、Excelに書き込む**
   - SQLクエリを作成して、現在のテーブルからすべてのデータを選択し、`SQLiteCommand`を使用してそのクエリを実行します。
   - `SQLiteDataReader`を使用してクエリ結果を読み取ります：
     - 列名を取得し、それを新しいワークシートの1行目に書き込みます。
     - 1行目（タイトル行）のフォントスタイルを太字にし、サイズを12に設定します。
     - データ行を繰り返し、各行のデータを対応するセルに書き込むと同時に、内容に合わせて列幅を自動調整します。
     - データ行のフォントサイズを11に設定します。

7. **データベース接続を閉じる**
   - すべてのテーブルのデータの読み取りと書き込みが終了したら、SQLiteデータベースとの接続を閉じます。

8. **Excelファイルを保存**
   - 作成したワークブックを、最初に定義したExcelファイルのパスに保存します。
   - `workbook`オブジェクトが使用しているリソースを解放します。

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

namespace SQLiteToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // SQLiteデータベースのパス
            string sqliteFilePath = "Sample.db";

            // Excelファイルのパス
            string excelFilePath = "output/DatabaseToExcel.xlsx";

            // 新しいワークブックインスタンスを作成
            Workbook workbook = new Workbook();
            // デフォルトのワークシートを削除
            workbook.Worksheets.Clear();

            // SQLite接続を作成
            using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;"))
            {
                connection.Open();

                // すべてのテーブル名を取得
                DataTable tables = connection.GetSchema("Tables");

                // 各テーブルを繰り返す
                foreach (DataRow tableRow in tables.Rows)
                {
                    string tableName = tableRow["TABLE_NAME"].ToString();

                    // 新しいワークシートを作成
                    Worksheet sheet = workbook.Worksheets.Add(tableName);

                    // テーブルデータを取得
                    string selectQuery = $"SELECT * FROM [{tableName}]";
                    using (SQLiteCommand command = new SQLiteCommand(selectQuery, connection))
                    {
                        using (SQLiteDataReader reader = command.ExecuteReader())
                        {
                            // 列名を取得し、1行目に書き込む
                            for (int col = 0; col < reader.FieldCount; col++)
                            {
                                sheet.Range[1, col + 1].Value = reader.GetName(col);
                            }
                            // タイトル行のフォントスタイルを設定
                            sheet.Rows[0].Style.Font.IsBold = true;
                            sheet.Rows[0].Style.Font.Size = 12;

                            // データ行を書き込む
                            int rowIndex = 2;
                            while (reader.Read())
                            {
                                for (int col = 0; col < reader.FieldCount; col++)
                                {
                                    sheet.Range[rowIndex, col + 1].Value = reader.GetValue(col).ToString();
                                    // 列幅を自動調整
                                    sheet.AutoFitColumn(col + 1);
                                }
                                // データ行のフォントサイズを設定
                                sheet.Rows[rowIndex - 1].Style.Font.Size = 11;
                                rowIndex++;
                            }
                        }
                    }
                }

                connection.Close();
            }

            // Excelファイルを保存
            workbook.SaveToFile(excelFilePath);
            workbook.Dispose();
            Console.WriteLine("データが正常にExcelファイルにエクスポートされました！");
        }
    }
}
```

結果
![SQLiteデータベースをExcelファイルにエクスポート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/bbb2710c-29be-e1b5-fc74-648d346492dd.png)

## AccessデータベースをExcelファイルにエクスポート
`System.Data.OleDb`を使用すると、Accessデータベースから直接データを読み取ることができます。同様の方法で、AccessデータベースからExcelファイルにデータをエクスポートできます。以下はその手順とコード例です：

1. **ファイルパスの定義**
   - Accessデータベースファイルのパスを`Database.accdb`に設定。
   - Excel出力ファイルのパスを`output/DatabaseToExcel.xlsx`に設定。

2. **Excelワークブックのインスタンス作成**
   - 新しい`Workbook`インスタンスを作成して、エクスポートするExcelファイルを表します。
   - デフォルトで含まれているワークシートを削除して、ワークブックを空にします。

3. **接続文字列の定義**
   - 指定したパスのAccessデータベースに接続するための接続文字列を定義します。`Microsoft.ACE.OLEDB.12.0`プロバイダーを使用し、セキュリ

ティ情報を保持しないように指定します。

4. **OleDb接続の確立**
   - `OleDbConnection`クラスを使用して、新しい接続オブジェクトを作成し、`Open()`メソッドを呼び出してAccessデータベースへの接続を開きます。

5. **データベース内のすべてのテーブル名を取得**
   - `GetSchema("Tables")`メソッドを呼び出して、データベース内のすべてのテーブル名を取得し、その結果を`DataTable`オブジェクトに格納します。

6. **各テーブルを処理（システムテーブルはスキップ）**
   - `DataTable`オブジェクト内の各行を繰り返し、テーブル名を抽出します。
   - システムテーブルをスキップし、ユーザー定義のテーブルのみを処理します。`TABLE_TYPE`列でタイプが`TABLE`のものを確認します。

7. **テーブルデータを読み取り、Excelに書き込む**
   - SQLクエリを作成して、現在のテーブルからすべてのデータを選択し、`OleDbCommand`を使用してそのクエリを実行します。
   - `OleDbDataReader`を使用してクエリ結果を読み取ります：
     - 列名を取得し、それを新しいワークシートの1行目に書き込みます。
     - 1行目（タイトル行）のフォントスタイルを太字にし、サイズを12に設定します。
     - データ行を繰り返し、各行のデータを対応するセルに書き込むと同時に、内容に合わせて列幅を自動調整します。
     - データ行のフォントサイズを11に設定します。

8. **データベース接続を閉じる**
   - すべてのテーブルのデータの読み取りと書き込みが終了したら、Accessデータベースとの接続を閉じます。

9. **Excelファイルを保存**
   - 作成したワークブックを、最初に定義したExcelファイルのパスに保存します。
   - `workbook`オブジェクトが使用しているリソースを解放します。

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

namespace AccessToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // Accessデータベースのパス
            string accessFilePath = "Database.accdb";

            // Excelファイルのパス
            string excelFilePath = "output/DatabaseToExcel.xlsx";

            // 新しいワークブックインスタンスを作成
            Workbook workbook = new Workbook();
            // デフォルトのワークシートを削除
            workbook.Worksheets.Clear();

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

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

                // すべてのテーブル名を取得
                DataTable tables = connection.GetSchema("Tables");

                // 各テーブルを繰り返す
                foreach (DataRow tableRow in tables.Rows)
                {
                    // システムテーブルをスキップ
                    if (tableRow["TABLE_TYPE"].ToString() != "TABLE") continue;

                    string tableName = tableRow["TABLE_NAME"].ToString();

                    // 新しいワークシートを作成
                    Worksheet sheet = workbook.Worksheets.Add(tableName);

                    // テーブルデータを取得
                    string selectQuery = $"SELECT * FROM [{tableName}]";
                    using (OleDbCommand command = new OleDbCommand(selectQuery, connection))
                    {
                        using (OleDbDataReader reader = command.ExecuteReader())
                        {
                            // 列名を取得し、1行目に書き込む
                            for (int col = 0; col < reader.FieldCount; col++)
                            {
                                sheet.Range[1, col + 1].Value = reader.GetName(col);
                            }
                            // タイトル行のフォントスタイルを設定
                            sheet.Rows[0].Style.Font.IsBold = true;
                            sheet.Rows[0].Style.Font.Size = 12;

                            // データ行を書き込む
                            int rowIndex = 2;
                            while (reader.Read())
                            {
                                for (int col = 0; col < reader.FieldCount; col++)
                                {
                                    sheet.Range[rowIndex, col + 1].Value = reader.GetValue(col)?.ToString() ?? "";
                                    // 列幅を自動調整
                                    sheet.AutoFitColumn(col + 1);
                                }
                                // データ行のフォントサイズを設定
                                sheet.Rows[rowIndex - 1].Style.Font.Size = 11;
                                rowIndex++;
                            }
                        }
                    }
                }

                connection.Close();
            }

            // Excelファイルを保存
            workbook.SaveToFile(excelFilePath);
            workbook.Dispose();
            Console.WriteLine("データが正常にExcelファイルにエクスポートされました！");
        }
    }
}
```

結果
![AccessデータベースをExcelファイルにエクスポート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d3fd98ae-2b30-4bba-06ec-eabfae357a4a.png)

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