Excelファイルのデータをデータベースにインポートすることは、データ処理の効率と正確性を向上させるだけでなく、データ分析や意思決定プロセスを大きく促進します。特に企業アプリケーションにおいて、Excelはデータ入力や初期整理のツールとして広く利用されていますが、複雑なクエリ、大規模なデータ管理、部門間のデータ共有に関しては限界があります。このプロセスを.NETプラットフォーム上でC#を使って実現することで、強力なデータ操作能力や豊富なライブラリを活用し、データをExcelからSQLiteなどのリレーショナルデータベースへシームレスに移行できます。これにより、効率的なデータ管理、強化されたデータセキュリティ、さらなるパフォーマンス最適化が実現し、データマイニングやビジネスインテリジェンス分析のための堅実な基盤を築くことができます。
本記事では、.NETプラットフォームでC#を使用してExcelファイルのデータをデータベースにインポートする方法について説明します。
ここで使用する手法には、無料のFree Spire.XLS for .NET(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#コード例を紹介します。
操作手順
- SQLiteデータベースファイルのパスを
Sample.db
、Excelファイルの出力先パスをoutput/DatabaseToExcel.xlsx
に設定します。 -
Workbook
インスタンスを新規作成し、Excelワークブックを表します。デフォルトのワークシートは削除します。 -
SQLiteConnection
を使ってSQLiteデータベースに新たな接続を作成し、接続を開きます。 - データベース内のすべてのテーブル名を
GetSchema("Tables")
メソッドで取得し、DataTable
オブジェクトに格納します。 - 各テーブル名を順に処理し、以下を実行します:
- 各テーブルごとに新しいワークシートをワークブックに追加し、ワークシート名をテーブル名に設定します。
- SQLクエリを構築してテーブル内の全データを取得し、
SQLiteCommand
で実行します。 -
SQLiteDataReader
でクエリ結果を読み取り、以下を実行します:- 列名を取得し、新しいワークシートの1行目に書き込みます。
- タイトル行(1行目)のフォントを太字でサイズ12に設定します。
- データ行を順に処理し、各データを対応するセルに書き込みます。各列の幅を自動調整し、データ行のフォントサイズを11に設定します。
- SQLiteデータベースとの接続を閉じます。
- 作成したワークブックを保存し、使用していた
workbook
オブジェクトのリソースを解放します。
C#コード例:
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データをAccessデータベースにインポートする方法
Accessデータベースにデータを書き込む際には、System.Data.OleDb
モジュールを使用します。以下に、具体的な操作手順とC#コード例を示します。
操作手順
- Excelファイルのパスを
Sample.xlsx
、Accessデータベースファイルのパスをoutput/Database.accdb
に設定します。 -
Workbook
クラスを使用して、指定されたExcelファイルを開き、メモリ上にロードします。 - Accessデータベースへの接続文字列を作成します。
- Accessデータベースファイルが存在するかを確認します。存在しない場合は、ユーザーにファイル作成を促し、プログラムを終了します。
- 新しい
OleDbConnection
オブジェクトを作成し、Accessデータベースへの接続を開きます。 - Excelワークブック内の各ワークシートを順に処理します:
- 現在のワークシート名を取得し、それを新しいテーブル名として使用します。
- ワークシートの最初の行から列名を取得し、すべての列をテキスト型(TEXT)として扱うSQLクエリを構築します。
- 各ワークシートに対して以下の操作を実行します:
-
CREATE TABLE
SQL文を使用して新しいテーブルを作成します。
-
- 各ワークシート内のすべてのデータ行(1行目は列名を含むためスキップ)について:
-
INSERT INTO
SQL文を作成し、データ行を挿入します。この際、SQLインジェクション対策として、シングルクォートをエスケープします。
-
-
INSERT INTO
文を実行して、データをAccessデータベース内の該当テーブルに挿入します。 - あるワークシートの処理中にエラーが発生した場合、例外をキャッチしてエラーメッセージを表示し、次のワークシートの処理を継続します。
- Accessデータベースとの接続を閉じ、
workbook
オブジェクトが使用していたリソースを解放します。
C#コード例:
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データベースに正常に書き込みました!");
}
}
}
このようにして、.NETプラットフォーム上でC#を使用してExcelデータをSQLiteまたはAccessデータベースに効率的にインポートできます。これにより、データ管理が容易になり、データ分析や意思決定の精度が向上します。