フッターコンテンツにスキップ
IRONXLの使用

C#でExcelをSQL Serverにインポートする方法

多くの異なるビジネスコンテキストで、ExcelからSQL Serverへデータをインポートすることは一般的な必要性です。 Excelファイルからデータを読み取り、それをSQL Serverデータベースに入力することがこの活動に関わるタスクです。 エクスポートウィザードがよく使われますが、IronXLはデータ処理に対してよりプログラム的で柔軟なアプローチを提供します。 IronXLは、ファイルからExcelデータをインポートできる強力なC#ライブラリです; これにより、この操作を迅速化することが可能です。 そのため、本投稿はC#を使用してExcelをSQL Serverにインポートするための設定、実行、改善についての詳細なガイドを提供します。

C#でExcelをSQL Serverにインポートする方法: 図1 - IronXL: C# Excelライブラリ

ExcelをSQL Serverにインポートする方法

  1. 開発環境をセットアップする
  2. Excelファイルを準備する
  3. SQL Serverデータベースと接続する
  4. IronXLを使用してExcelファイルからデータを読み取る
  5. IronPDFを使用してデータをエクスポートし、PDFレポートを生成する
  6. PDFレポートを確認する

IronXLとは?

IronXLは、時々IronXL.Excelとも呼ばれるように、.NETアプリケーションでExcelファイルを扱う作業を簡単にするために開発された機能豊富なC#ライブラリです。 この強力なツールは、Microsoft Excelをコンピュータにインストールする必要がなく、Excelファイルを読み取り、作成、および編集できるため、サーバーサイドのアプリケーションに最適です。 Excel 2007以降(.xlsx)およびExcel 97–2003(.xls)形式がIronXLでサポートされており、さまざまなExcelファイルのバージョンを管理する柔軟性を提供します。 ワークシート、行、列を操作するほかに、データを挿入、更新、および削除するなど、重大なデータ操作が可能です。

IronXLは、セルの書式設定やExcelの数式もサポートしており、複雑でよくフォーマットされたスプレッドシートのプログラム化された生成を可能にします。 複数の.NETプラットフォーム、.NET Framework、.NET Core、および.NET 5/6との互換性とパフォーマンスの最適化により、IronXLは大規模なデータセットを効果的に処理することを保証します。 シンプルなデータのインポート/エクスポート活動にも、複雑な報告システムにもかかわらず、アプリケーションにExcelファイル操作を統合したい開発者にとって、他の.NETフレームワークとのスムーズなインターフェースのおかげで柔軟な選択肢となります。

主要機能

Excelファイルの読み書き

開発者はIronXLを使用してExcelファイルへのデータの読み書きができます。 新しいExcelファイルを作成して既存のものを編集するのは簡単です。

Microsoft Excelのインストール不要

IronXLは他のいくつかのライブラリと異なり、アプリケーションをホストしているコンピュータ上にMicrosoft Excelをインストールする必要がありません。 このため、サーバーサイドのアプリには最適です。

さまざまなExcel形式のサポート

ライブラリはExcel 97-2003 (.xls) および Excel 2007以降 (.xlsx) 形式をサポートすることで、さまざまなExcelファイルタイプの管理に柔軟性を提供します。

新しいVisual Studioプロジェクトを作成

Visual Studioコンソールプロジェクトは簡単に作成できます。 Visual Studioでコンソールアプリケーションを作成するために次の操作を行います:

  1. Visual Studioを開く: Visual Studioがコンピュータにインストールされていることを確認してから開きます。
  2. 新しいプロジェクトを開始: ファイル -> 新規作成 -> プロジェクト を選択します。

C#でExcelをSQL Serverにインポートする方法: 図2 - 新規作成をクリック

  1. Create a new project ボックスの左パネルで、好みのプログラミング言語を選びます。例えば、C#。
  2. 使用可能なプロジェクトテンプレートのリストから コンソールアプリ または コンソールアプリ (.NET Core) テンプレートを選択します。
  3. 名前 セクションにプロジェクトの名前を入力します。

C#でExcelをSQL Serverにインポートする方法: 図3 - 名前と保存場所を指定

  1. プロジェクトを保存する場所を決定します。
  2. 作成 をクリックしてコンソール用のアプリケーションプロジェクトを起動します。

C#でExcelをSQL Serverにインポートする方法: 図4 - 最後に作成をクリックしてアプリケーションを起動

IronXLライブラリをインストールする

次の更新のためにはIronXLライブラリのインストールが必要です。 最後に、手続きを完了するためにはNuGetパッケージマネージャコンソールを起動し、以下のコマンドを入力します:

Install-Package IronXL.Excel

C#でExcelをSQL Serverにインポートする方法: 図5 - NuGetパッケージマネージャコンソールに上記コマンドを入力してIronXLをインストール

別の方法として、NuGetパッケージマネージャを使用して IronXL パッケージを検索する手段もあります。 これにより、IronXLに関連付けられたNuGetパッケージの中からどれをダウンロードするか選択できます。

C#でExcelをSQL Serverにインポートする方法: 図6 - 代わりにNuGetパッケージマネージャを使ってIronXLを検索しインストール

IronXLを使ったExcelのSQLへのインポート

IronXLを使ったExcelからのデータ読み取り

Excelファイルからデータを読み取るプロセスはIronXLによって容易にされています。 以下の例では、IronXLを使ってExcelファイルからデータを読み取る方法を示しています。このアプローチで、データは読み取られ、各Excelシートの行に対応する辞書のリストに保存されます。

using IronXL;
using System;
using System.Collections.Generic;

public class ExcelReader
{
    public static List<Dictionary<string, object>> ReadExcelFile(string filePath)
    {
        // Initialize a list to store data from Excel
        var data = new List<Dictionary<string, object>>();

        // Load the workbook from the file path provided
        WorkBook workbook = WorkBook.Load(filePath);

        // Access the first worksheet in the workbook
        WorkSheet sheet = workbook.WorkSheets[0];

        // Retrieve column headers from the first row
        var headers = new List<string>();
        foreach (var header in sheet.Rows[0].Columns)
        {
            headers.Add(header.ToString());
        }

        // Loop through each row starting from the second row
        for (int i = 1; i < sheet.Rows.Count; i++)
        {
            // Create a dictionary to store the row data associated with column headers
            var rowData = new Dictionary<string, object>();
            for (int j = 0; j < headers.Count; j++)
            {
                rowData[headers[j]] = sheet.Rows[i][j].Value;
            }
            data.Add(rowData);
        }

        return data;
    }
}
using IronXL;
using System;
using System.Collections.Generic;

public class ExcelReader
{
    public static List<Dictionary<string, object>> ReadExcelFile(string filePath)
    {
        // Initialize a list to store data from Excel
        var data = new List<Dictionary<string, object>>();

        // Load the workbook from the file path provided
        WorkBook workbook = WorkBook.Load(filePath);

        // Access the first worksheet in the workbook
        WorkSheet sheet = workbook.WorkSheets[0];

        // Retrieve column headers from the first row
        var headers = new List<string>();
        foreach (var header in sheet.Rows[0].Columns)
        {
            headers.Add(header.ToString());
        }

        // Loop through each row starting from the second row
        for (int i = 1; i < sheet.Rows.Count; i++)
        {
            // Create a dictionary to store the row data associated with column headers
            var rowData = new Dictionary<string, object>();
            for (int j = 0; j < headers.Count; j++)
            {
                rowData[headers[j]] = sheet.Rows[i][j].Value;
            }
            data.Add(rowData);
        }

        return data;
    }
}
Imports IronXL
Imports System
Imports System.Collections.Generic

Public Class ExcelReader
	Public Shared Function ReadExcelFile(ByVal filePath As String) As List(Of Dictionary(Of String, Object))
		' Initialize a list to store data from Excel
		Dim data = New List(Of Dictionary(Of String, Object))()

		' Load the workbook from the file path provided
		Dim workbook As WorkBook = WorkBook.Load(filePath)

		' Access the first worksheet in the workbook
		Dim sheet As WorkSheet = workbook.WorkSheets(0)

		' Retrieve column headers from the first row
		Dim headers = New List(Of String)()
		For Each header In sheet.Rows(0).Columns
			headers.Add(header.ToString())
		Next header

		' Loop through each row starting from the second row
		For i As Integer = 1 To sheet.Rows.Count - 1
			' Create a dictionary to store the row data associated with column headers
			Dim rowData = New Dictionary(Of String, Object)()
			For j As Integer = 0 To headers.Count - 1
				rowData(headers(j)) = sheet.Rows(i)(j).Value
			Next j
			data.Add(rowData)
		Next i

		Return data
	End Function
End Class
$vbLabelText   $csharpLabel

SQL Serverへの接続

System.Data.SqlClient 名前空間から SqlConnection クラスを使用してSQL Serverに接続を確立します。 通常、データベース名、サーバー名、認証情報で構成される正しい接続文字列を持っていることを確認してください。 SQL Serverデータベースに接続しデータを追加する方法は以下の例で説明しています。

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;

public class SqlServerConnector
{
    private string connectionString;

    // Constructor accepts a connection string
    public SqlServerConnector(string connectionString)
    {
        this.connectionString = connectionString;
    }

    // Inserts data into the specified table
    public void InsertData(Dictionary<string, object> data, string tableName)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // Construct an SQL INSERT command with parameterized values to prevent SQL injection
            var columns = string.Join(",", data.Keys);
            var parameters = string.Join(",", data.Keys.Select(key => "@" + key));
            string query = $"INSERT INTO {tableName} ({columns}) VALUES ({parameters})";

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                // Add parameters to the command
                foreach (var kvp in data)
                {
                    command.Parameters.AddWithValue("@" + kvp.Key, kvp.Value ?? DBNull.Value);
                }

                // Execute the command
                command.ExecuteNonQuery();
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;

public class SqlServerConnector
{
    private string connectionString;

    // Constructor accepts a connection string
    public SqlServerConnector(string connectionString)
    {
        this.connectionString = connectionString;
    }

    // Inserts data into the specified table
    public void InsertData(Dictionary<string, object> data, string tableName)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // Construct an SQL INSERT command with parameterized values to prevent SQL injection
            var columns = string.Join(",", data.Keys);
            var parameters = string.Join(",", data.Keys.Select(key => "@" + key));
            string query = $"INSERT INTO {tableName} ({columns}) VALUES ({parameters})";

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                // Add parameters to the command
                foreach (var kvp in data)
                {
                    command.Parameters.AddWithValue("@" + kvp.Key, kvp.Value ?? DBNull.Value);
                }

                // Execute the command
                command.ExecuteNonQuery();
            }
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Data.SqlClient
Imports System.Linq

Public Class SqlServerConnector
	Private connectionString As String

	' Constructor accepts a connection string
	Public Sub New(ByVal connectionString As String)
		Me.connectionString = connectionString
	End Sub

	' Inserts data into the specified table
	Public Sub InsertData(ByVal data As Dictionary(Of String, Object), ByVal tableName As String)
		Using connection As New SqlConnection(connectionString)
			connection.Open()

			' Construct an SQL INSERT command with parameterized values to prevent SQL injection
			Dim columns = String.Join(",", data.Keys)
			Dim parameters = String.Join(",", data.Keys.Select(Function(key) "@" & key))
			Dim query As String = $"INSERT INTO {tableName} ({columns}) VALUES ({parameters})"

			Using command As New SqlCommand(query, connection)
				' Add parameters to the command
				For Each kvp In data
					command.Parameters.AddWithValue("@" & kvp.Key, If(kvp.Value, DBNull.Value))
				Next kvp

				' Execute the command
				command.ExecuteNonQuery()
			End Using
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

IronXLとSQL Serverの組み合わせ

Excelファイルを読み取りSQLデータベースにデータを挿入するためのロジックが確立されたら、これらの機能を統合してインポートプロセスを完了します。 次のアプリケーションは、Excelファイルから情報を受け取りMicrosoft SQL Serverデータベースに追加します。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // Define the path to the Excel file, SQL connection string, and target table name
        string excelFilePath = "path_to_your_excel_file.xlsx";
        string connectionString = "your_sql_server_connection_string";
        string tableName = "your_table_name";

        // Read data from Excel
        List<Dictionary<string, object>> excelData = ExcelReader.ReadExcelFile(excelFilePath);

        // Create an instance of the SQL connector and insert data
        SqlServerConnector sqlConnector = new SqlServerConnector(connectionString);
        foreach (var row in excelData)
        {
            sqlConnector.InsertData(row, tableName);
        }

        Console.WriteLine("Data import completed successfully.");
    }
}
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // Define the path to the Excel file, SQL connection string, and target table name
        string excelFilePath = "path_to_your_excel_file.xlsx";
        string connectionString = "your_sql_server_connection_string";
        string tableName = "your_table_name";

        // Read data from Excel
        List<Dictionary<string, object>> excelData = ExcelReader.ReadExcelFile(excelFilePath);

        // Create an instance of the SQL connector and insert data
        SqlServerConnector sqlConnector = new SqlServerConnector(connectionString);
        foreach (var row in excelData)
        {
            sqlConnector.InsertData(row, tableName);
        }

        Console.WriteLine("Data import completed successfully.");
    }
}
Imports System
Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Define the path to the Excel file, SQL connection string, and target table name
		Dim excelFilePath As String = "path_to_your_excel_file.xlsx"
		Dim connectionString As String = "your_sql_server_connection_string"
		Dim tableName As String = "your_table_name"

		' Read data from Excel
		Dim excelData As List(Of Dictionary(Of String, Object)) = ExcelReader.ReadExcelFile(excelFilePath)

		' Create an instance of the SQL connector and insert data
		Dim sqlConnector As New SqlServerConnector(connectionString)
		For Each row In excelData
			sqlConnector.InsertData(row, tableName)
		Next row

		Console.WriteLine("Data import completed successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

このクラスはIronXLを使用して指定されたExcelファイルからデータを読み取る責任があります。ReadExcelFile 関数はExcelワークブックをロードし、最初のワークシートを開き、データワークシートの行をループすることでデータを収集します。 テーブルの扱いを容易にするために情報は辞書のリストに保存されます。

C#でExcelをSQL Serverにインポートする方法: 図7 - 例としての入力Excelファイル

このクラスは指定されたデータベーステーブルにデータを挿入し、SQL Serverデータベースへの接続を管理します。 InsertData メソッドはSQLインジェクションを避けるためにパラメータ化されたクエリを使用し、辞書のキーを表す列名に基づいて動的にSQL INSERTクエリを構築します。

ExcelReader クラスを使用してExcelファイルからSQLテーブルにデータを読み込み、 SqlServerConnector クラスを使用して各行をSQL Serverテーブルに挿入し、Main 関数が全プロセスを管理します。

C#でExcelをSQL Serverにインポートする方法: 図8 - SQL Serverでのクエリの成功を示す出力

エラーハンドリングと最適化は、堅牢で効率的なインポートプロセスを確保するために重要です。 欠落したファイル、無効なデータ形式、SQL例外などの潜在的な問題を管理するために、強力なエラーハンドリングを実装することができます。 エラーハンドリングを組み込む例を以下に示します。

try
{
    // Insert the importing logic here
}
catch (Exception ex)
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
try
{
    // Insert the importing logic here
}
catch (Exception ex)
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
Try
	' Insert the importing logic here
Catch ex As Exception
	Console.WriteLine("An error occurred: " & ex.Message)
End Try
$vbLabelText   $csharpLabel

結論

最後に、C#とIronXLを使用してExcelからMS SQLデータベースにデータをインポートすることは.NETアプリケーション内でExcelファイルを管理するための効果的で信頼性のある方法です。 IronXLは複数のExcel形式と互換性があり、Microsoft ExcelをインストールすることなくExcelデータの読み書きを容易にする強力な機能を持っています。 System.Data.SqlClient とIronXLの統合により、開発者はSQLサーバー間のデータ移動を安全性を高め、SQLインジェクションを防止するためのパラメータ化されたクエリを使用して簡単に行うことができます。

最後に、IronXLとIron Softwareを.NET開発のツールセットに追加することで、Excelの操作、PDFの作成、OCRの使用、バーコードの活用を効率的に管理できます。 Iron Softwareの柔軟なスイートとIronXLの使いやすさ、相互運用性、およびパフォーマンスを組み合わせることで、開発を合理化し、アプリケーションの機能を向上させます。 プロジェクトの要件に合わせた明確なライセンスオプションにより、開発者は適切なモデルを自信を持って選択できます。 これらの利点を利用することで、開発者はコンプライアンスと透明性を保ちつつ、多様な困難に効果的に取り組むことができます。

よくある質問

C#を使用してExcelデータをSQL Serverにインポートする最良の方法は何ですか?

IronXLライブラリを使用すると、Microsoft Excelをインストールすることなく、Excelファイルを読み取り、データベースにデータを挿入することで、効率的にExcelデータをSQL Serverにインポートできます。

Microsoft Excelを使用せずに、C#でExcelファイルを読み取るにはどうすればよいですか?

IronXLは、Microsoft Excelを必要とせずにC#でExcelファイルを読み取ることを可能にします。Excelワークブックを読み込み、ワークシートにアクセスし、シンプルなメソッドを使用してデータを抽出できます。

C#アプリケーションでExcelファイルをSQL Serverに接続するステップは何ですか?

最初に、IronXLを使用してExcelファイルを読み取ります。その後、SqlConnectionクラスを使用してSQL Serverに接続を確立し、SqlCommandを使用してSQLデータベースにデータを挿入します。

なぜ.NETアプリケーションでExcel操作にIronXLを使用するべきですか?

IronXLは効率的なデータ処理を提供し、複数の.NETプラットフォームと互換性があり、Excelをインストールする必要がないため、サーバーサイドアプリケーションや大規模なデータセットの処理に最適です。

C#で大規模なExcelデータセットを処理するにはどうすればよいですか?

IronXLは大規模なデータセットをサポートしており、Excelファイル内のデータを効率的に読み取り、操作し、アプリケーションに統合することができ、パフォーマンスの問題を回避できます。

ExcelをSQL Serverにインポートする際のエラーハンドリング戦略は何ですか?

ファイルが見つからない、無効なデータ形式、SQL例外などの潜在的なエラーを処理するために、try-catchブロックを実装して、スムーズなインポートプロセスを確保します。

C#アプリケーションでExcelデータのSQL Serverへのインポートを自動化できますか?

はい、IronXLを使用して、Excelファイルを読み取り、最小限の手作業でデータをSQL Serverに挿入するC#アプリケーションを書くことで、自動化できます。

C#におけるSQLインジェクションを防止するために、パラメータ化されたクエリはどのように機能しますか?

C#のパラメータ化されたクエリは、SQLコマンド内でパラメータ用のプレースホルダーを使用することで、データを安全にSQL Serverに挿入でき、SQLインジェクション攻撃を防ぐことができます。

ExcelデータをSQL Serverにインポートする際のパフォーマンスを最適化するにはどうすればよいですか?

バッチ挿入を使用し、大規模データセットをIronXLで効率よく処理し、SQL Serverの接続とコマンドが適切に構成されていることを確認して、パフォーマンスを最適化します。

プロジェクトでIronXLを使用するライセンスのオプションは何ですか?

IronXLは、プロジェクトのニーズに合わせた柔軟なライセンスオプションを提供し、開発者がアプリケーション要件と予算に合った最適なプランを選択できるようにします。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。