企業のビジネスが成長し、複雑さが増す中で、データの効果的な分析、共有、および報告が重要になります。Excelは広く使われているデータ処理ツールであり、その強力な計算機能、視覚化オプション、さまざまなデータ分析ツールとの互換性により、データベースからのデータエクスポートの理想的な選択肢です。C#プログラミング言語の強力な機能と、豊富な.NETライブラリのサポートを活用することで、開発者はデータベースからExcelファイルへのデータ移行を効率的に行い、特定のビジネスロジックに基づいてエクスポートプロセスをカスタマイズできます。これにより、データの正確性と完全性を確保し、ユーザーエクスペリエンスを向上させ、さまざまなユーザーの報告要求に対応できます。
本記事では、.NETプラットフォームでC#コードを使用してデータベースのデータをExcelファイルにエクスポートする方法を紹介します。
本記事で使用する方法には、無料のFree Spire.XLS for .NETと、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に書き込むことができます。以下はその手順とコード例です:
-
ファイルパスの定義
- SQLiteデータベースファイルのパスを
Sample.db
に設定。 - Excel出力ファイルのパスを
output/DatabaseToExcel.xlsx
に設定。
- SQLiteデータベースファイルのパスを
-
Excelワークブックのインスタンス作成
- 新しい
Workbook
インスタンスを作成して、エクスポートするExcelファイルを表します。 - デフォルトで含まれているワークシートを削除して、ワークブックを空にします。
- 新しい
-
SQLite接続の確立
-
SQLiteConnection
クラスを使用して、SQLiteデータベースへの新しい接続を作成し、データソースとバージョン番号を指定して接続文字列を初期化します。 - SQLiteデータベースへの接続を開きます。
-
-
データベース内のすべてのテーブル名を取得
-
GetSchema("Tables")
メソッドを呼び出して、データベース内のすべてのテーブル名を取得し、その結果をDataTable
オブジェクトに格納します。
-
-
各テーブルを処理
-
DataTable
オブジェクト内の各行を繰り返し、テーブル名を抽出します。 - 各テーブルに対して、Excelワークブックに新しいワークシートを追加し、そのワークシートの名前をテーブル名にします。
-
-
テーブルデータを読み取り、Excelに書き込む
- SQLクエリを作成して、現在のテーブルからすべてのデータを選択し、
SQLiteCommand
を使用してそのクエリを実行します。 -
SQLiteDataReader
を使用してクエリ結果を読み取ります:- 列名を取得し、それを新しいワークシートの1行目に書き込みます。
- 1行目(タイトル行)のフォントスタイルを太字にし、サイズを12に設定します。
- データ行を繰り返し、各行のデータを対応するセルに書き込むと同時に、内容に合わせて列幅を自動調整します。
- データ行のフォントサイズを11に設定します。
- SQLクエリを作成して、現在のテーブルからすべてのデータを選択し、
-
データベース接続を閉じる
- すべてのテーブルのデータの読み取りと書き込みが終了したら、SQLiteデータベースとの接続を閉じます。
-
Excelファイルを保存
- 作成したワークブックを、最初に定義したExcelファイルのパスに保存します。
-
workbook
オブジェクトが使用しているリソースを解放します。
コード例
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ファイルにエクスポートされました!");
}
}
}
AccessデータベースをExcelファイルにエクスポート
System.Data.OleDb
を使用すると、Accessデータベースから直接データを読み取ることができます。同様の方法で、AccessデータベースからExcelファイルにデータをエクスポートできます。以下はその手順とコード例です:
-
ファイルパスの定義
- Accessデータベースファイルのパスを
Database.accdb
に設定。 - Excel出力ファイルのパスを
output/DatabaseToExcel.xlsx
に設定。
- Accessデータベースファイルのパスを
-
Excelワークブックのインスタンス作成
- 新しい
Workbook
インスタンスを作成して、エクスポートするExcelファイルを表します。 - デフォルトで含まれているワークシートを削除して、ワークブックを空にします。
- 新しい
-
接続文字列の定義
- 指定したパスのAccessデータベースに接続するための接続文字列を定義します。
Microsoft.ACE.OLEDB.12.0
プロバイダーを使用し、セキュリ
- 指定したパスのAccessデータベースに接続するための接続文字列を定義します。
ティ情報を保持しないように指定します。
-
OleDb接続の確立
-
OleDbConnection
クラスを使用して、新しい接続オブジェクトを作成し、Open()
メソッドを呼び出してAccessデータベースへの接続を開きます。
-
-
データベース内のすべてのテーブル名を取得
-
GetSchema("Tables")
メソッドを呼び出して、データベース内のすべてのテーブル名を取得し、その結果をDataTable
オブジェクトに格納します。
-
-
各テーブルを処理(システムテーブルはスキップ)
-
DataTable
オブジェクト内の各行を繰り返し、テーブル名を抽出します。 - システムテーブルをスキップし、ユーザー定義のテーブルのみを処理します。
TABLE_TYPE
列でタイプがTABLE
のものを確認します。
-
-
テーブルデータを読み取り、Excelに書き込む
- SQLクエリを作成して、現在のテーブルからすべてのデータを選択し、
OleDbCommand
を使用してそのクエリを実行します。 -
OleDbDataReader
を使用してクエリ結果を読み取ります:- 列名を取得し、それを新しいワークシートの1行目に書き込みます。
- 1行目(タイトル行)のフォントスタイルを太字にし、サイズを12に設定します。
- データ行を繰り返し、各行のデータを対応するセルに書き込むと同時に、内容に合わせて列幅を自動調整します。
- データ行のフォントサイズを11に設定します。
- SQLクエリを作成して、現在のテーブルからすべてのデータを選択し、
-
データベース接続を閉じる
- すべてのテーブルのデータの読み取りと書き込みが終了したら、Accessデータベースとの接続を閉じます。
-
Excelファイルを保存
- 作成したワークブックを、最初に定義したExcelファイルのパスに保存します。
-
workbook
オブジェクトが使用しているリソースを解放します。
コード例
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ファイルにエクスポートされました!");
}
}
}
この記事では、.NETプラットフォーム上でC#を使用してデータベースをExcelファイルにエクスポートする方法を説明しました。