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

C#でIronXLを使用してExcelファイルを生成する方法

C# または Visual Basic でプログラムによって Excel ワークシート ファイルを生成するには、伝統的に Microsoft Office のインストールや複雑な COM インタープを必要としていました。IronXL はこれを完全に変え、Office に依存せずに Excel アプリケーション ファイルを作成するための単純な API を提供します。 このチュートリアルでは、基本的なスプレッドシートの作成から高度なフォーマットやデータベース統合まで、C# を使用して IronXL で Excel ファイルを構築する方法について説明しています。 レポートの作成、データのエクスポート(XLS ファイルまたは XLSX ファイル)、またはスプレッドシート生成の自動化を行う際に、.NET アプリケーションでの Excel を扱うための基本的な技術を学びます。

C# での Excel 生成: 画像 1 - IronXL

なぜ Microsoft Office なしで Excel ワークシート ファイルを生成するのか?

Office への依存性なしで Excel 生成機能を開発することは、重大なデプロイメントの課題を解決します。 サーバー環境には、通常、ライセンスコストとリソースオーバーヘッドのために Microsoft Office はインストールされていません。 各 Office インストールは大量のディスク空間とメモリを必要とし、クラウド展開やコンテナ化されたアプリケーションには非現実的です。

IronXL は独立して動作することでこれらの制約を取り除きます。 C# での Excel ファイル生成は、Windows、Linux、macOS、Docker コンテナ、または Azure App Services 上で変更なしに動作します。 このクロスプラットフォーム互換性により、一度記述し、.NET Framework、.NET Core、または .NET 8/9 アプリケーションを対象にしてどこでもデプロイできます。

C# での Excel 生成: 画像 2 - クロスプラットフォーム

COM インタープのオーバーヘッドなしでパフォーマンスが劇的に改善されます。 従来の Office 自動化は各操作のために別々のプロセスインスタンスを作成し、メモリと CPU リソースを消費します。 IronXL はすべてをアプリケーションのプロセススペース内でメモリ内で処理し、Excel ファイルをプログラムによって生成するときにより高速な実行と低いリソース消費を実現します。

デプロイメントがシンプルになります。IronXL は単一の NuGet パッケージとして提供されます。 レジストリエントリー、COM 登録、および Office サービスパックのメンテナンスが不要です。 継続的インテグレーションパイプラインがスムーズに動作し、Docker コンテナが軽量に保たれます。 このシンプルなアプローチにより、IronXL は人気のある選択肢となっており、開発者フォーラムでプロフェッショナルが Excel 自動化についての経験を共有しています。

一部の開発者は、Office Open XML ファイル構造で直接作業するために、Microsoft の Open XML Productivity Tool をまだ探索しています。 ただし、そのアプローチには XML スキーマや Open XML SDK インストールの詳細な知識を要するため、さらなる手動の努力が必要です。 IronXL はこれらの複雑さを解消し、いくつかの異なる XML ファイルを扱う作業を抽象化し、Excel をプログラムで扱うためのはるかに迅速な方法を提供します。

C# を使用して IronXL で Excel ファイルを生成する方法: 図 3 - 機能

C&# プロジェクトに IronXL をインストールする方法?

IronXL のインストールは、Solution Explorer で NuGet パッケージマネージャーを通じてほんの数分で完了します。 Visual Studio でプロジェクトを右クリックし、「NuGet パッケージの管理」を選択します。「IronXL.Excel」を検索し、インストールをクリックします。 パッケージには、C# で Excel ファイルを生成するために必要なすべての依存関係が自動的に含まれます。

あるいは、パッケージマネージャーコンソールを使用します:

Install-Package IronXL.Excel

C# を使用して IronXL で Excel ファイルを生成する方法: 図 4 - インストール

.NET CLI ユーザーがモダンな C# プロジェクトで作業するためには:

dotnet add package IronXL.Excel
dotnet add package IronXL.Excel
SHELL

Excel ファイルのプログラム作成をテストすることでインストールを検証します:

using IronXL;
// new Excel workbook
var workbook = WorkBook.Create();
Console.WriteLine("IronXL installed successfully!");
using IronXL;
// new Excel workbook
var workbook = WorkBook.Create();
Console.WriteLine("IronXL installed successfully!");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このコードはメモリ内のワークブックオブジェクトを作成します。 エラーなく実行されれば、IronXL が使用準備完了であることを示しています。 ライブラリはすべてのモダンな .NET バージョンをサポートし、既存のプロジェクトと互換性があります。 詳細なインストールガイドとトラブルシューティングについては、公式ドキュメントを参照してください。 始める準備はできましたか? 今すぐ IronXL をダウンロードして、数分で Excel ファイルを生成し始めましょう。

出力

C# を使用して IronXL で Excel ファイルを生成する方法: 図 5 - コンソール出力

初めての Excel ファイルを作成する方法?

IronXL を使用した Excel ファイルの作成は、WorkBook クラスから始まり、これはすべての Excel 操作へのゲートウェイです。 ライブラリは、モダンな XLSX 形式とレガシーな XLS 形式の両方をサポートしており、C# で Excel ファイルを生成する際のさまざまな要件に柔軟性をもたらします。

using IronXL;
// Create a new workbook (XLSX format by default)
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add metadata
workbook.Metadata.Title = "Monthly Sales Report";
workbook.Metadata.Author = "Sales Department";
workbook.Metadata.Comments = "Generated using IronXL";
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("January Sales");
// Add some basic data
worksheet["A1"].Value = "Date";
worksheet["B1"].Value = "Product";
worksheet["C1"].Value = "Quantity";
worksheet["D1"].Value = "Revenue";
// Add data rows
worksheet["A2"].Value = new DateTime(2024, 1, 15);
worksheet["B2"].Value = "Widget Pro";
worksheet["C2"].Value = 100;
worksheet["D2"].Value = 2500.00;
// Save the workbook
workbook.SaveAs("FirstExcelFile.xlsx");
using IronXL;
// Create a new workbook (XLSX format by default)
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add metadata
workbook.Metadata.Title = "Monthly Sales Report";
workbook.Metadata.Author = "Sales Department";
workbook.Metadata.Comments = "Generated using IronXL";
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("January Sales");
// Add some basic data
worksheet["A1"].Value = "Date";
worksheet["B1"].Value = "Product";
worksheet["C1"].Value = "Quantity";
worksheet["D1"].Value = "Revenue";
// Add data rows
worksheet["A2"].Value = new DateTime(2024, 1, 15);
worksheet["B2"].Value = "Widget Pro";
worksheet["C2"].Value = 100;
worksheet["D2"].Value = 2500.00;
// Save the workbook
workbook.SaveAs("FirstExcelFile.xlsx");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このコードは Excel ファイル生成の主要な概念をいくつか示します。 WorkBook.Create() メソッドは、新しい Excel ファイルをメモリ内に初期化します。 ExcelFileFormat 列挙型を使用して形式を指定し、モダンな Excel との互換性のために XLSX を、レガシーサポートには XLS を選択します。 メタデータプロパティは、Microsoft のドキュメントのプロパティ標準に準拠した Excel のファイルプロパティに表示されるドキュメント情報を埋め込むことができます。

CreateWorkSheet() メソッドは、指定された名前の新しいシートを追加します。 Excel のお馴染みのセル表記 (A1, B1 など) は、値を設定する際に直感的です。IronXL はデータ型変換を自動で処理し、日付、数値、テキストを明示的なキャストなしで認識します。 SaveAs() メソッドは、完全な Excel ファイルをディスクに書き込みます。 さらなるワークシート操作については、ワークシート管理のチュートリアルをご覧ください。

出力

C# を使用して IronXL で Excel ファイルを生成する方法: 図 6 - 基本的な Excel 出力

Excel セルにデータを書き込む方法?

IronXL は、個々のセルの割り当てから一括範囲操作まで、Excel セルの入力に複数のアプローチを提供します。 これらの方法を理解することで、あなたのデータシナリオに最も効率的なアプローチを選択できます。

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Individual cell assignment
worksheet["A1"].Value = "Employee Name";
worksheet["A2"].Value = "John Smith";
worksheet["A3"].Value = "Jane Doe";
// Range assignment for multiple cells
worksheet["B1:B3"].Value = "Active";
// Using numeric indices (0-based)
worksheet.SetCellValue(0, 2, "Department"); // C1
worksheet.SetCellValue(1, 2, "Sales");       // C2
worksheet.SetCellValue(2, 2, "Marketing");   // C3
// Array-based population
string[] headers = { "ID", "Name", "Email", "Phone" };
for (int i = 0; i < headers.Length; i++)
{
    worksheet.SetCellValue(0, i, headers[i]);
}
// Working with different data types
worksheet["E1"].Value = "Salary";
worksheet["E2"].Value = 75000.50m;  // Decimal for currency
worksheet["E3"].Value = 82000.75m;
worksheet["F1"].Value = "Start Date";
worksheet["F2"].Value = new DateTime(2020, 3, 15);
worksheet["F3"].Value = new DateTime(2019, 7, 1);
worksheet["G1"].Value = "Full Time";
worksheet["G2"].Value = true;  // Boolean
worksheet["G3"].Value = true;
workbook.SaveAs("FirstExcelFile.xlsx");
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Individual cell assignment
worksheet["A1"].Value = "Employee Name";
worksheet["A2"].Value = "John Smith";
worksheet["A3"].Value = "Jane Doe";
// Range assignment for multiple cells
worksheet["B1:B3"].Value = "Active";
// Using numeric indices (0-based)
worksheet.SetCellValue(0, 2, "Department"); // C1
worksheet.SetCellValue(1, 2, "Sales");       // C2
worksheet.SetCellValue(2, 2, "Marketing");   // C3
// Array-based population
string[] headers = { "ID", "Name", "Email", "Phone" };
for (int i = 0; i < headers.Length; i++)
{
    worksheet.SetCellValue(0, i, headers[i]);
}
// Working with different data types
worksheet["E1"].Value = "Salary";
worksheet["E2"].Value = 75000.50m;  // Decimal for currency
worksheet["E3"].Value = 82000.75m;
worksheet["F1"].Value = "Start Date";
worksheet["F2"].Value = new DateTime(2020, 3, 15);
worksheet["F3"].Value = new DateTime(2019, 7, 1);
worksheet["G1"].Value = "Full Time";
worksheet["G2"].Value = true;  // Boolean
worksheet["G3"].Value = true;
workbook.SaveAs("FirstExcelFile.xlsx");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このコードは IronXL の柔軟なセルアドレス指定を示します。 文字列表記 ("A1") は Excel ユーザーにとって自然に感じられ、数値インデックスによってループや動的な生成のためにプログラム的な制御が提供されます。 範囲の割り当て ("B1:B3") は複数のセルを同じ値に効率的に設定し、列の初期化やデフォルト値の適用に最適です。

IronXL はさまざまなデータ型を賢く処理します。小数は財務データ用に精度を維持し、DateTime オブジェクトは Excel の日付として適切にフォーマットされ、ブール値は TRUE/FALSE と表示されます。 この自動変換により手動のフォーマットコードが不要になり、データの整合性が保証されます。

出力

C# を使用して IronXL で Excel ファイルを生成する方法: 図 7 - Excel 出力

より大きなデータセットのために、このパターンを検討してください:

// Populate from a data source
var employees = GetEmployeeData(); // Your data source
for (int row = 0; row < employees.Count; row++)
{
    worksheet[$"A{row + 2}"].Value = employees[row].Id;
    worksheet[$"B{row + 2}"].Value = employees[row].Name;
    worksheet[$"C{row + 2}"].Value = employees[row].Department;
    worksheet[$"D{row + 2}"].Value = employees[row].Salary;
}
// Populate from a data source
var employees = GetEmployeeData(); // Your data source
for (int row = 0; row < employees.Count; row++)
{
    worksheet[$"A{row + 2}"].Value = employees[row].Id;
    worksheet[$"B{row + 2}"].Value = employees[row].Name;
    worksheet[$"C{row + 2}"].Value = employees[row].Department;
    worksheet[$"D{row + 2}"].Value = employees[row].Salary;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このアプローチはデータコレクションを介して繰り返し、それぞれのプロパティを対応する列にマッピングします。 文字列の補間 ($"A{row + 2}") によって動的にセルアドレスが生成され、ヘッダーを保持するために 2 行目から開始します。

プロフェッショナルなフォーマットを適用する方法?

プロフェッショナルな Excel ファイルには、生データ以上が必要です。 IronXL のスタイリング API は、C# で Excel ファイルを生成する際に書式設定、色、視覚の階層を使用して、単純なスプレッドシートを洗練されたビジネス文書に変換します。

using IronXL;
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Header formatting
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
// Column width adjustment
worksheet.AutoSizeColumn(0); // Auto-fit column A
worksheet.GetColumn(1).Width = 20; // Set column B to 20 characters
// Number formatting
var salaryColumn = worksheet["E2:E3"];
salaryColumn.FormatString = "$#,##0.00";
// Date formatting  
var dateColumn = worksheet["F2:F3"];
dateColumn.FormatString = "MM/dd/yyyy";
// Cell borders
var dataRange = worksheet["A1:G3"];
dataRange.Style.TopBorder.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.BottomBorder.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.LeftBorder.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.RightBorder.Type = IronXL.Styles.BorderType.Thin;
// To set border color, use:
dataRange.Style.TopBorder.Color = "#000000";
dataRange.Style.BottomBorder.Color = "#000000";
dataRange.Style.LeftBorder.Color = "#000000";
dataRange.Style.RightBorder.Color = "#000000";
// Text alignment
worksheet["A1:G1"].Style.HorizontalAlignment = IronXL.Styles.HorizontalAlignment.Center;
// Alternating row colors for readability
for (int row = 2; row <= 3; row++)
{
    if (row % 2 == 0)
    {
        worksheet[$"A{row}:G{row}"].Style.SetBackgroundColor("#F2F2F2");
    }
}
using IronXL;
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Header formatting
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
// Column width adjustment
worksheet.AutoSizeColumn(0); // Auto-fit column A
worksheet.GetColumn(1).Width = 20; // Set column B to 20 characters
// Number formatting
var salaryColumn = worksheet["E2:E3"];
salaryColumn.FormatString = "$#,##0.00";
// Date formatting  
var dateColumn = worksheet["F2:F3"];
dateColumn.FormatString = "MM/dd/yyyy";
// Cell borders
var dataRange = worksheet["A1:G3"];
dataRange.Style.TopBorder.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.BottomBorder.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.LeftBorder.Type = IronXL.Styles.BorderType.Thin;
dataRange.Style.RightBorder.Type = IronXL.Styles.BorderType.Thin;
// To set border color, use:
dataRange.Style.TopBorder.Color = "#000000";
dataRange.Style.BottomBorder.Color = "#000000";
dataRange.Style.LeftBorder.Color = "#000000";
dataRange.Style.RightBorder.Color = "#000000";
// Text alignment
worksheet["A1:G1"].Style.HorizontalAlignment = IronXL.Styles.HorizontalAlignment.Center;
// Alternating row colors for readability
for (int row = 2; row <= 3; row++)
{
    if (row % 2 == 0)
    {
        worksheet[$"A{row}:G{row}"].Style.SetBackgroundColor("#F2F2F2");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このフォーマットコードは、企業標準に合致するプロフェッショナルな外観を作成します。 背景色のついた太字のヘッダーは視覚的な階層を確立します。 SetBackgroundColor() メソッドは 16 進色コードを受け入れ、カラースキームへの正確な制御を提供します。 フォントプロパティには、サイズ、色、太字、斜体、下線オプションが含まれており、企業のブランドガイドラインに従う Excel ファイルの作成には必須です。

列幅の調整は、テキストの切り捨てを防ぎます。 AutoSizeColumn() はコンテンツに自動的にフィットし、SetColumnWidth() は正確な制御を提供します。 数値の書式設定は Excel のフォーマットコードを使用します。 たとえば、"$#,##0.00" は千単位の桁区切り記号と小数点以下 2 桁で通貨を表示します。 日付の書式設定も類似のパターンに従い、Microsoft の Excel 仕様にドキュメントとして記載された Excel の日付フォーマット文字列を使用します。

罫線はデータの境界を定義し、可読性を向上させます。 BorderType 列挙型は、細線、中線、太線、点線、破線といったさまざまなスタイルを提供します。 配置オプションはヘッダーを中央に配置し、数字を右寄せにして、スプレッドシートの慣例に従います。 交互の行の色、いわゆる "バンド付き行" は、広いデータセットを横断して情報を追跡するために役立ちます。 フォーマットされた Excel データを作成するための上級フォーマットについては、セルスタイリングガイドをご覧ください。

出力

C# を使用して IronXL で Excel ファイルを生成する方法: 図 8 - フォーマットされた Excel 出力

Excel フォーミュラをプログラム的に使用する方法?

Excel フォーミュラは、自動計算でスプレッドシートに生命を吹き込みます。 IronXL はフォーミュラの作成と評価をサポートしており、動的なスプレッドシートを自動的に更新できます。

var workbook = WorkBook.Create();
// Create a budget worksheet
WorkSheet budget = workbook.CreateWorkSheet("Q1 Budget");
// Headers
budget["A1"].Value = "Category";
budget["B1"].Value = "January";
budget["C1"].Value = "February";
budget["D1"].Value = "March";
budget["E1"].Value = "Q1 Total";
// Budget categories and values
string[] categories = { "Salaries", "Marketing", "Operations", "Equipment", "Training" };
decimal[,] monthlyBudgets = {
    { 50000, 52000, 51000 },
    { 15000, 18000, 20000 },
    { 8000, 8500, 9000 },
    { 12000, 5000, 7000 },
    { 3000, 3500, 4000 }
};
// Populate data
for (int i = 0; i < categories.Length; i++)
{
    budget[$"A{i + 2}"].Value = categories[i];
    budget[$"B{i + 2}"].Value = monthlyBudgets[i, 0];
    budget[$"C{i + 2}"].Value = monthlyBudgets[i, 1];
    budget[$"D{i + 2}"].Value = monthlyBudgets[i, 2];
    // Row total formula
    budget[$"E{i + 2}"].Formula = $"=SUM(B{i + 2}:D{i + 2})";
}
// Monthly totals row
budget["A7"].Value = "Monthly Total";
budget["B7"].Formula = "=SUM(B2:B6)";
budget["C7"].Formula = "=SUM(C2:C6)";
budget["D7"].Formula = "=SUM(D2:D6)";
budget["E7"].Formula = "=SUM(E2:E6)";
// Calculate percentages
budget["A9"].Value = "Marketing %";
budget["B9"].Formula = "=B3/B7*100";
budget["C9"].Formula = "=C3/C7*100";
budget["D9"].Formula = "=D3/D7*100";
// Average calculation
budget["A10"].Value = "Average Spending";
budget["B10"].Formula = "=AVERAGE(B2:B6)";
// Evaluate all formulas
workbook.EvaluateAll();
workbook.SaveAs("Budget.xlsx");
var workbook = WorkBook.Create();
// Create a budget worksheet
WorkSheet budget = workbook.CreateWorkSheet("Q1 Budget");
// Headers
budget["A1"].Value = "Category";
budget["B1"].Value = "January";
budget["C1"].Value = "February";
budget["D1"].Value = "March";
budget["E1"].Value = "Q1 Total";
// Budget categories and values
string[] categories = { "Salaries", "Marketing", "Operations", "Equipment", "Training" };
decimal[,] monthlyBudgets = {
    { 50000, 52000, 51000 },
    { 15000, 18000, 20000 },
    { 8000, 8500, 9000 },
    { 12000, 5000, 7000 },
    { 3000, 3500, 4000 }
};
// Populate data
for (int i = 0; i < categories.Length; i++)
{
    budget[$"A{i + 2}"].Value = categories[i];
    budget[$"B{i + 2}"].Value = monthlyBudgets[i, 0];
    budget[$"C{i + 2}"].Value = monthlyBudgets[i, 1];
    budget[$"D{i + 2}"].Value = monthlyBudgets[i, 2];
    // Row total formula
    budget[$"E{i + 2}"].Formula = $"=SUM(B{i + 2}:D{i + 2})";
}
// Monthly totals row
budget["A7"].Value = "Monthly Total";
budget["B7"].Formula = "=SUM(B2:B6)";
budget["C7"].Formula = "=SUM(C2:C6)";
budget["D7"].Formula = "=SUM(D2:D6)";
budget["E7"].Formula = "=SUM(E2:E6)";
// Calculate percentages
budget["A9"].Value = "Marketing %";
budget["B9"].Formula = "=B3/B7*100";
budget["C9"].Formula = "=C3/C7*100";
budget["D9"].Formula = "=D3/D7*100";
// Average calculation
budget["A10"].Value = "Average Spending";
budget["B10"].Formula = "=AVERAGE(B2:B6)";
// Evaluate all formulas
workbook.EvaluateAll();
workbook.SaveAs("Budget.xlsx");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

この予算の例は、フォーミュラの実際の応用を示しています。 Formula プロパティは、等号で始まる標準の Excel フォーミュラ構文を受け入れます。 IronXL は一般的な関数に対応しています:SUM, AVERAGE, COUNT, MAX, MIN 他多数。 フォーミュラ内のセル参照は Excel と全く同様に、相対参照と絶対参照に対応しています。

行の合計フォーミュラ (=SUM(B{i + 2}:D{i + 2})) は各カテゴリの四半期ごとの合計を計算します。 文字列補間は各行の適切なセル参照を動的に生成します。 月ごとの合計は全列を合算し、割合計算は特定のセルを合計で除算します。

EvaluateAll() メソッドはすべてのフォーミュラを処理し、ワークブック全体で計算値を更新します。 これにより、Excel で開かれたときにフォーミュラが結果を表示することが保証されます。 評価なしでは、Excel は再計算をユーザーがトリガするまでフォーミュラを表示します。

出力

C# を使用して IronXL で Excel ファイルを生成する方法: 図 9 - フォーミュラを使用した Excel 出力

データベースから Excel へのデータエクスポート方法?

現実的なアプリケーションは、レポートや分析のためにデータベースデータを Excel にエクスポートすることが多々あります。 IronXL は C# アプリケーションから Excel ファイルを生成するときの手動のフィールドマッピングを不要にし、組み込まれた DataTable サポートを持ってこのプロセスを簡素化しています。

using System.Data;
using System.Data.SqlClient;
// Simulate database retrieval (replace with your actual database code)
DataTable GetSalesData()
{
    DataTable dt = new DataTable("Sales");
    dt.Columns.Add("OrderID", typeof(int));
    dt.Columns.Add("CustomerName", typeof(string));
    dt.Columns.Add("Product", typeof(string));
    dt.Columns.Add("Quantity", typeof(int));
    dt.Columns.Add("UnitPrice", typeof(decimal));
    dt.Columns.Add("OrderDate", typeof(DateTime));
    // Sample data (normally from database)
    dt.Rows.Add(1001, "ABC Corp", "Widget Pro", 50, 25.99m, DateTime.Now.AddDays(-5));
    dt.Rows.Add(1002, "XYZ Ltd", "Widget Basic", 100, 15.99m, DateTime.Now.AddDays(-4));
    dt.Rows.Add(1003, "ABC Corp", "Widget Premium", 25, 45.99m, DateTime.Now.AddDays(-3));
    dt.Rows.Add(1004, "Tech Solutions", "Widget Pro", 75, 25.99m, DateTime.Now.AddDays(-2));
    dt.Rows.Add(1005, "XYZ Ltd", "Widget Premium", 30, 45.99m, DateTime.Now.AddDays(-1));
    return dt;
}
// Export to Excel
WorkBook reportWorkbook = WorkBook.Create();
WorkSheet reportSheet = reportWorkbook.CreateWorkSheet("Sales Report");
// Get data from database
DataTable salesData = GetSalesData();
// Method 1: Manual mapping with formatting
reportSheet["A1"].Value = "Order Report - " + DateTime.Now.ToString("MMMM yyyy");
reportSheet.Merge("A1:F1");
reportSheet["A1"].Style.Font.Bold = true;
reportSheet["A1"].Style.Font.Height = 14;
// Headers
int headerRow = 3;
for (int col = 0; col < salesData.Columns.Count; col++)
{
    reportSheet.SetCellValue(headerRow - 1, col, salesData.Columns[col].ColumnName);
}
// Format headers
var headers = reportSheet[$"A{headerRow}:F{headerRow}"];
headers.Style.Font.Bold = true;
headers.Style.SetBackgroundColor("#D9E1F2");
// Data rows
for (int row = 0; row < salesData.Rows.Count; row++)
{
    for (int col = 0; col < salesData.Columns.Count; col++)
    {
        reportSheet.SetCellValue(row + headerRow, col, salesData.Rows[row][col]);
    }
    // Add total column with formula
    reportSheet[$"G{row + headerRow + 1}"].Formula = $"=D{row + headerRow + 1}*E{row + headerRow + 1}";
}
// Add total header and format
reportSheet["G3"].Value = "Total";
reportSheet["G3"].Style.Font.Bold = true;
reportSheet["G3"].Style.SetBackgroundColor("#D9E1F2");
// Format currency columns
reportSheet[$"E{headerRow + 1}:E{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
reportSheet[$"G{headerRow + 1}:G{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
// Format date column
reportSheet[$"F{headerRow + 1}:F{headerRow + salesData.Rows.Count}"].FormatString = "MM/dd/yyyy";
// Add summary section
int summaryRow = headerRow + salesData.Rows.Count + 2;
reportSheet[$"A{summaryRow}"].Value = "Summary";
reportSheet[$"A{summaryRow}"].Style.Font.Bold = true;
reportSheet[$"A{summaryRow + 1}"].Value = "Total Orders:";
reportSheet[$"B{summaryRow + 1}"].Formula = $"=COUNTA(A{headerRow + 1}:A{headerRow + salesData.Rows.Count})";
reportSheet[$"A{summaryRow + 2}"].Value = "Total Revenue:";
reportSheet[$"B{summaryRow + 2}"].Formula = $"=SUM(G{headerRow + 1}:G{headerRow + salesData.Rows.Count})";
reportSheet[$"B{summaryRow + 2}"].FormatString = "$#,##0.00";
// Auto-fit columns
for (int col = 0; col <= 6; col++)
{
    reportSheet.AutoSizeColumn(col);
}
// Evaluate formulas and save
reportWorkbook.EvaluateAll();
reportWorkbook.SaveAs("DatabaseExport.xlsx");
using System.Data;
using System.Data.SqlClient;
// Simulate database retrieval (replace with your actual database code)
DataTable GetSalesData()
{
    DataTable dt = new DataTable("Sales");
    dt.Columns.Add("OrderID", typeof(int));
    dt.Columns.Add("CustomerName", typeof(string));
    dt.Columns.Add("Product", typeof(string));
    dt.Columns.Add("Quantity", typeof(int));
    dt.Columns.Add("UnitPrice", typeof(decimal));
    dt.Columns.Add("OrderDate", typeof(DateTime));
    // Sample data (normally from database)
    dt.Rows.Add(1001, "ABC Corp", "Widget Pro", 50, 25.99m, DateTime.Now.AddDays(-5));
    dt.Rows.Add(1002, "XYZ Ltd", "Widget Basic", 100, 15.99m, DateTime.Now.AddDays(-4));
    dt.Rows.Add(1003, "ABC Corp", "Widget Premium", 25, 45.99m, DateTime.Now.AddDays(-3));
    dt.Rows.Add(1004, "Tech Solutions", "Widget Pro", 75, 25.99m, DateTime.Now.AddDays(-2));
    dt.Rows.Add(1005, "XYZ Ltd", "Widget Premium", 30, 45.99m, DateTime.Now.AddDays(-1));
    return dt;
}
// Export to Excel
WorkBook reportWorkbook = WorkBook.Create();
WorkSheet reportSheet = reportWorkbook.CreateWorkSheet("Sales Report");
// Get data from database
DataTable salesData = GetSalesData();
// Method 1: Manual mapping with formatting
reportSheet["A1"].Value = "Order Report - " + DateTime.Now.ToString("MMMM yyyy");
reportSheet.Merge("A1:F1");
reportSheet["A1"].Style.Font.Bold = true;
reportSheet["A1"].Style.Font.Height = 14;
// Headers
int headerRow = 3;
for (int col = 0; col < salesData.Columns.Count; col++)
{
    reportSheet.SetCellValue(headerRow - 1, col, salesData.Columns[col].ColumnName);
}
// Format headers
var headers = reportSheet[$"A{headerRow}:F{headerRow}"];
headers.Style.Font.Bold = true;
headers.Style.SetBackgroundColor("#D9E1F2");
// Data rows
for (int row = 0; row < salesData.Rows.Count; row++)
{
    for (int col = 0; col < salesData.Columns.Count; col++)
    {
        reportSheet.SetCellValue(row + headerRow, col, salesData.Rows[row][col]);
    }
    // Add total column with formula
    reportSheet[$"G{row + headerRow + 1}"].Formula = $"=D{row + headerRow + 1}*E{row + headerRow + 1}";
}
// Add total header and format
reportSheet["G3"].Value = "Total";
reportSheet["G3"].Style.Font.Bold = true;
reportSheet["G3"].Style.SetBackgroundColor("#D9E1F2");
// Format currency columns
reportSheet[$"E{headerRow + 1}:E{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
reportSheet[$"G{headerRow + 1}:G{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
// Format date column
reportSheet[$"F{headerRow + 1}:F{headerRow + salesData.Rows.Count}"].FormatString = "MM/dd/yyyy";
// Add summary section
int summaryRow = headerRow + salesData.Rows.Count + 2;
reportSheet[$"A{summaryRow}"].Value = "Summary";
reportSheet[$"A{summaryRow}"].Style.Font.Bold = true;
reportSheet[$"A{summaryRow + 1}"].Value = "Total Orders:";
reportSheet[$"B{summaryRow + 1}"].Formula = $"=COUNTA(A{headerRow + 1}:A{headerRow + salesData.Rows.Count})";
reportSheet[$"A{summaryRow + 2}"].Value = "Total Revenue:";
reportSheet[$"B{summaryRow + 2}"].Formula = $"=SUM(G{headerRow + 1}:G{headerRow + salesData.Rows.Count})";
reportSheet[$"B{summaryRow + 2}"].FormatString = "$#,##0.00";
// Auto-fit columns
for (int col = 0; col <= 6; col++)
{
    reportSheet.AutoSizeColumn(col);
}
// Evaluate formulas and save
reportWorkbook.EvaluateAll();
reportWorkbook.SaveAs("DatabaseExport.xlsx");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

この包括的な例は、C# で Excel ファイルを生成するための完全なデータベースから Excel のワークフローを示しています。 DataTable はデータベースの取得をシミュレートしています。実際には、Entity Framework、Dapper、または ADO.NET を使用して、実際のデータベースクエリでこれを置き換えます。 手動のマッピングアプローチは、Microsoft のデータエクスポートのベストプラクティスとして推奨されるように、書式設定とレイアウトに対する完全な制御を提供します。

コードはタイトル、フォーマットされたヘッダー、データ行でプロフェッショナルなレポートを作成します。 フォーミュラ列は、各行のトータルを動的に計算します。 サマリーセクションは、データが変更された場合にこれらの値が更新されるように、注文の件数および収益をカウントするために Excel フォーミュラを利用します。 通貨と日付のフォーマットはビジネス文書の標準に従い、全ての内容が適切に表示されるように列幅が自動調整されます。 大規模データセットを扱うためのパフォーマンス最適化ガイドをお調べください。

出力

C# を使用して IronXL で Excel ファイルを生成する方法: 図 10 - データベースの Excel 出力へのエクスポート

Excel レポートを効率化したいですか? ライセンスを取得し、本番展開のために IronXL の完全な機能を解放します。

複数のワークシートを管理する方法?

複雑な Excel ファイルはしばしば関連データを整理するために複数のワークシートを必要とします。 IronXL は、作成、アクセス、ワークシートの整理のための直感的なメソッドで複数シートの管理を簡素化します。

// Create a multi-sheet workbook
WorkBook companyReport = WorkBook.Create();
// Create department sheets
WorkSheet salesSheet = companyReport.CreateWorkSheet("Sales");
WorkSheet inventorySheet = companyReport.CreateWorkSheet("Inventory");
WorkSheet hrSheet = companyReport.CreateWorkSheet("HR Metrics");
// Populate Sales sheet
salesSheet["A1"].Value = "Sales Dashboard";
salesSheet["A3"].Value = "Region";
salesSheet["B3"].Value = "Q1 Sales";
salesSheet["C3"].Value = "Q2 Sales";
string[] regions = { "North", "South", "East", "West" };
decimal[] q1Sales = { 250000, 180000, 220000, 195000 };
decimal[] q2Sales = { 275000, 195000, 240000, 210000 };
for (int i = 0; i < regions.Length; i++)
{
    salesSheet[$"A{i + 4}"].Value = regions[i];
    salesSheet[$"B{i + 4}"].Value = q1Sales[i];
    salesSheet[$"C{i + 4}"].Value = q2Sales[i];
}
// Populate Inventory sheet
inventorySheet["A1"].Value = "Inventory Status";
inventorySheet["A3"].Value = "Product";
inventorySheet["B3"].Value = "Stock Level";
inventorySheet["C3"].Value = "Reorder Point";
inventorySheet["D3"].Value = "Status";
// Add inventory data with conditional status
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] stock = { 150, 45, 200 };
int[] reorderPoint = { 100, 50, 75 };
for (int i = 0; i < products.Length; i++)
{
    inventorySheet[$"A{i + 4}"].Value = products[i];
    inventorySheet[$"B{i + 4}"].Value = stock[i];
    inventorySheet[$"C{i + 4}"].Value = reorderPoint[i];
    // Status based on stock level
    string status = stock[i] <= reorderPoint[i] ? "REORDER" : "OK";
    inventorySheet[$"D{i + 4}"].Value = status;
    // Color code status
    if (status == "REORDER")
    {
        inventorySheet[$"D{i + 4}"].Style.Font.Color = "#FF0000";
    }
}
// Create summary sheet referencing other sheets
WorkSheet summarySheet = companyReport.CreateWorkSheet("Summary");
summarySheet["A1"].Value = "Company Overview";
summarySheet["A3"].Value = "Metric";
summarySheet["B3"].Value = "Value";
summarySheet["A4"].Value = "Total Q1 Sales";
summarySheet["B4"].Formula = "=SUM(Sales!B4:B7)";
summarySheet["A5"].Value = "Total Q2 Sales";
summarySheet["B5"].Formula = "=SUM(Sales!C4:C7)";
summarySheet["A6"].Value = "Products Need Reorder";
summarySheet["B6"].Formula = "=COUNTIF(Inventory!D4:D6,\"REORDER\")";
// Format all sheets consistently
foreach (WorkSheet sheet in companyReport.WorkSheets)
{
    // Format headers
    sheet["A1"].Style.Font.Bold = true;
    sheet["A1"].Style.Font.Height = 14;
    var headerRow = sheet["A3:D3"];
    headerRow.Style.Font.Bold = true;
    headerRow.Style.SetBackgroundColor("#E7E6E6");
}
// Save multi-sheet workbook
companyReport.SaveAs("CompanyReport.xlsx");
// Create a multi-sheet workbook
WorkBook companyReport = WorkBook.Create();
// Create department sheets
WorkSheet salesSheet = companyReport.CreateWorkSheet("Sales");
WorkSheet inventorySheet = companyReport.CreateWorkSheet("Inventory");
WorkSheet hrSheet = companyReport.CreateWorkSheet("HR Metrics");
// Populate Sales sheet
salesSheet["A1"].Value = "Sales Dashboard";
salesSheet["A3"].Value = "Region";
salesSheet["B3"].Value = "Q1 Sales";
salesSheet["C3"].Value = "Q2 Sales";
string[] regions = { "North", "South", "East", "West" };
decimal[] q1Sales = { 250000, 180000, 220000, 195000 };
decimal[] q2Sales = { 275000, 195000, 240000, 210000 };
for (int i = 0; i < regions.Length; i++)
{
    salesSheet[$"A{i + 4}"].Value = regions[i];
    salesSheet[$"B{i + 4}"].Value = q1Sales[i];
    salesSheet[$"C{i + 4}"].Value = q2Sales[i];
}
// Populate Inventory sheet
inventorySheet["A1"].Value = "Inventory Status";
inventorySheet["A3"].Value = "Product";
inventorySheet["B3"].Value = "Stock Level";
inventorySheet["C3"].Value = "Reorder Point";
inventorySheet["D3"].Value = "Status";
// Add inventory data with conditional status
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] stock = { 150, 45, 200 };
int[] reorderPoint = { 100, 50, 75 };
for (int i = 0; i < products.Length; i++)
{
    inventorySheet[$"A{i + 4}"].Value = products[i];
    inventorySheet[$"B{i + 4}"].Value = stock[i];
    inventorySheet[$"C{i + 4}"].Value = reorderPoint[i];
    // Status based on stock level
    string status = stock[i] <= reorderPoint[i] ? "REORDER" : "OK";
    inventorySheet[$"D{i + 4}"].Value = status;
    // Color code status
    if (status == "REORDER")
    {
        inventorySheet[$"D{i + 4}"].Style.Font.Color = "#FF0000";
    }
}
// Create summary sheet referencing other sheets
WorkSheet summarySheet = companyReport.CreateWorkSheet("Summary");
summarySheet["A1"].Value = "Company Overview";
summarySheet["A3"].Value = "Metric";
summarySheet["B3"].Value = "Value";
summarySheet["A4"].Value = "Total Q1 Sales";
summarySheet["B4"].Formula = "=SUM(Sales!B4:B7)";
summarySheet["A5"].Value = "Total Q2 Sales";
summarySheet["B5"].Formula = "=SUM(Sales!C4:C7)";
summarySheet["A6"].Value = "Products Need Reorder";
summarySheet["B6"].Formula = "=COUNTIF(Inventory!D4:D6,\"REORDER\")";
// Format all sheets consistently
foreach (WorkSheet sheet in companyReport.WorkSheets)
{
    // Format headers
    sheet["A1"].Style.Font.Bold = true;
    sheet["A1"].Style.Font.Height = 14;
    var headerRow = sheet["A3:D3"];
    headerRow.Style.Font.Bold = true;
    headerRow.Style.SetBackgroundColor("#E7E6E6");
}
// Save multi-sheet workbook
companyReport.SaveAs("CompanyReport.xlsx");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

この例は、完全なマルチシートレポートを作成します。 各ワークシートは特定の目的に役立ちます: 販売データ、在庫管理、人事指標。 サマリシートは、クロスシートフォーミュラを使用して主要指標を統合します。 フォーミュラの中のシート参照構文に "Sales!B4:B7" がありますが、これは Sales シートの B4 から B7 を参照します。

在庫シートは、条件ロジックを示しており、在庫が少ない項目を赤で着色して即時の注意が必要であることを示しています。 foreach ループは、全シートに一貫したフォーマットを適用し、ワークブック内で一貫したプロフェッショナルな外観を維持します。 シート名は Excel のタブとして表示され、ユーザーが簡単に異なるデータビュー間をナビゲートできるようにします。

Excel 生成のためのベストプラクティスは何ですか?

C# での効率的な Excel ファイル生成には、メモリ使用量、エラーハンドリング、デプロイメントへの思慮深いアプローチが必要です。 これらのプラクティスは、Excel スプレッドシートをプログラム的に作成する際に、アプリケーションが効果的にスケールし、信頼性を維持することを保証します。

メモリ管理は、大きなファイルで重要になります。 すべてのデータセットをメモリにロードするのではなく、データをチャンク単位で処理します。

// Process large datasets efficiently
public void ExportLargeDataset(string filename)
{
    WorkBook workbook = WorkBook.Create();
    WorkSheet sheet = workbook.CreateWorkSheet("Data");
    int rowsPerBatch = 1000;
    int currentRow = 1;
    // Process in batches
    foreach (var batch in GetDataInBatches(rowsPerBatch))
    {
        foreach (var record in batch)
        {
            sheet[$"A{currentRow}"].Value = record.Id;
            sheet[$"B{currentRow}"].Value = record.Name;
            sheet[$"C{currentRow}"].Value = record.Value;
            currentRow++;
        }
    }
    workbook.SaveAs(filename);
}
// Process large datasets efficiently
public void ExportLargeDataset(string filename)
{
    WorkBook workbook = WorkBook.Create();
    WorkSheet sheet = workbook.CreateWorkSheet("Data");
    int rowsPerBatch = 1000;
    int currentRow = 1;
    // Process in batches
    foreach (var batch in GetDataInBatches(rowsPerBatch))
    {
        foreach (var record in batch)
        {
            sheet[$"A{currentRow}"].Value = record.Id;
            sheet[$"B{currentRow}"].Value = record.Name;
            sheet[$"C{currentRow}"].Value = record.Value;
            currentRow++;
        }
    }
    workbook.SaveAs(filename);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

エラーハンドリングはアプリケーションのクラッシュを防ぎ、Excel ファイルを生成する際に意味のあるフィードバックを提供します。

try
{
    WorkBook workbook = WorkBook.Create();
    // Excel generation code
    workbook.SaveAs("output.xlsx");
}
catch (Exception ex)
{
    // Log the error
    Console.WriteLine($"Excel generation failed: {ex.Message}");
    // Implement appropriate recovery or notification
}
try
{
    WorkBook workbook = WorkBook.Create();
    // Excel generation code
    workbook.SaveAs("output.xlsx");
}
catch (Exception ex)
{
    // Log the error
    Console.WriteLine($"Excel generation failed: {ex.Message}");
    // Implement appropriate recovery or notification
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Web アプリケーションでは、Excel ファイルをメモリ内で生成し、ユーザーにストリームします。

// ASP.NET Core example
public IActionResult DownloadExcel()
{
    WorkBook workbook = GenerateReport();
    var stream = new MemoryStream();
    workbook.SaveAs(stream);
    stream.Position = 0;
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "report.xlsx");
}
// ASP.NET Core example
public IActionResult DownloadExcel()
{
    WorkBook workbook = GenerateReport();
    var stream = new MemoryStream();
    workbook.SaveAs(stream);
    stream.Position = 0;
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "report.xlsx");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

デプロイメントの考慮は、スムーズな本番運用を保証します。 IronXL は、昇格された権限なしで制限された環境で動作し、共有ホスティングおよびコンテナ化されたデプロイメントに適しています。 IronXL ライセンスファイルをデプロイメントパッケージに含め、必要に応じて一時ファイル操作のための書き込み権限があることを確認します。 追加のデプロイメントガイダンスについては、デプロイメント文書を参照してください。

結論

IronXL は、Excel ファイル生成を C# での複雑なチャレンジから簡単なコーディングに変えます。 ワークブック作成、セルの入力、フォーマットの適用、フォーミュラの使用、データベースデータのエクスポートを、Microsoft Office の依存なしで学びました。 プログラムによって Excel ファイルを生成するこれらの技術は、Windows、Linux、およびクラウドプラットフォーム全体で一貫して動作します。

C# アプリケーションで Excel を生成する準備ができましたか? Start your free trial or explore the comprehensive API ドキュメントで上級機能を探索してください。 本番展開には、プロジェクト要件に合ったライセンスオプションを確認してください。

C# を使用して IronXL で Excel ファイルを生成する方法: 図 11 - ライセンス

よくある質問

IronXLとは何ですか?

IronXLは、Microsoft Officeや複雑なCOMインターロップを必要とせずに、C#でExcelファイルを作成、読み込み、編集することを可能にするライブラリです。

C#を使用してExcelファイルを生成するにはどうすればよいですか?

IronXLを使用することで、C#でExcelファイルを生成できます。これは、Excelファイルをプログラム的に作成、フォーマット、および操作するための簡単なAPIを提供します。

IronXLを使用するためにMicrosoft Officeをインストールする必要がありますか?

いいえ、IronXLを使用するには、システムにMicrosoft Officeをインストールする必要はありません。これは、Excelファイルの作成と編集のための軽量なソリューションです。

IronXLは高度なExcel書式設定を扱うことができますか?

はい、IronXLは高度な書式設定オプションをサポートしており、スプレッドシートにスタイル、フォーマット、およびその他のExcel機能を適用することができます。

IronXLを使用してExcelファイルとデータベースを統合することは可能ですか?

はい、IronXLを使用すると、Excelファイルをデータベースと統合でき、C#アプリケーションから直接データエクスポートやレポートの作成が容易になります。

IronXLはどのようなファイル形式を扱えますか?

IronXLは、XLSおよびXLSXファイル形式の両方を扱うことができ、Excelファイルの取り扱いにおいて柔軟性を提供します。

IronXLを使用してスプレッドシート生成を自動化できますか?

はい、IronXLを使用すると、スプレッドシートの生成を自動化することができ、レポート作成やデータエクスポートなどのタスクに最適です。

IronXLは.NETアプリケーションをサポートしていますか?

IronXLは.NETアプリケーションと完全に互換性があり、C#プロジェクト内でシームレスな統合と機能性を提供します。

IronXL の一般的な使用例は何ですか?

IronXLの一般的な使用例には、レポートの作成、データのエクスポート、スプレッドシートタスクの自動化、および.NETアプリケーション内でのExcel機能の統合があります。

IronXLはC#でのExcelファイル作成をどのように簡素化しますか?

IronXLは、複雑なセットアップや依存関係の必要を排除し、開発プロセスを簡素化するシンプルで直感的なAPIを提供することで、Excelファイル作成を簡素化します。

Curtis Chau
テクニカルライター

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

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