IRONXLの使用 C#でExcelピボットテーブルを作成するには? カーティス・チャウ 更新日:2025年10月19日 IronXL をダウンロード NuGet ダウンロード DLL ダウンロード 無料トライアル LLM向けのコピー LLM向けのコピー LLM 用の Markdown としてページをコピーする ChatGPTで開く このページについてChatGPTに質問する ジェミニで開く このページについてGeminiに問い合わせる Grokで開く このページについてGrokに質問する 困惑の中で開く このページについてPerplexityに問い合わせる 共有する Facebook で共有 Xでシェア(Twitter) LinkedIn で共有 URLをコピー 記事をメールで送る C# で Excel ピボット テーブルを作成するには、Office Interop (Microsoft Office のインストールが必要) または独立して動作する IronXL などの最新のライブラリを使用します。IronXL は、 DevOps環境に優れた展開の柔軟性とクロスプラットフォーム サポートを提供します。 プログラムでピボット テーブルを生成するには、Office 依存関係を持つ C# 相互運用性 か、独立して動作するIronXLなどの最新ライブラリが必要です。 このチュートリアルでは、両方のアプローチについて説明し、特にDocker コンテナーやAzureやAWSなどのクラウド環境にデプロイする場合に、開発者が従来の相互運用方法よりも IronXL を選択するケースが増えている理由について説明します。 この記事では、 DevOpsエンジニアが求めるデプロイメントのシンプルさを維持しながら、自動分析とエラー処理を使用してピボット テーブルとグループを編集、作成、設計、計算する方法を学習します。 Excel ピボット テーブルとは何ですか? ピボット テーブルは、Excel の最も強力なツールの 1 つです。 これは大規模なデータ セットを要約する簡単な方法であり、 .NET アプリケーションでのデータ分析に非常に役立ちます。 ピボット テーブルを使用すると、数値データを簡単に表示、理解、分析できます。 これらは Excel だけでなく、Google Sheets、Apple Numbers、 CSV エクスポートなどの他のプログラムでも利用できます。 これらは、データを概観するためのソリューションを提供します。データ コンソールとして機能し、ユーザーが情報を意味のある方法で確認できるようにします。 コンテナー化されたアプリケーションの場合、ピボット テーブルをプログラムで作成すると、Docker イメージに Excel をインストールする必要がなくなり、コンテナーのサイズと展開の複雑さが大幅に軽減されます。 このアプローチは、最新の CI/CD パイプラインおよびコンテナ展開戦略に完全に適合します。 ピボット テーブルを作成する間違った方法を調べて、C# で正しい方法を学びましょう。 C#インターオプを使用してExcelテーブルでピボットテーブルを作成するには? C# Excel Interopは、COMオートメーションを通じてExcelのピボットテーブル機能への直接アクセスを提供します。 C# でピボット テーブルを生成するツールを探すときに多くの開発者が見つける従来のアプローチは次のとおりです。 なぜこのアプローチは .NET では時代遅れだと考えられるのでしょうか? using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; // Create Excel application instance Excel.Application xlApp = new Excel.Application(); Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Data\SalesData.xlsx"); Excel.Worksheet xlSheet = (Excel.Worksheet)xlWorkbook.Sheets[1]; Excel.Worksheet xlPivotSheet = (Excel.Worksheet)xlWorkbook.Sheets.Add(); // Define data range for pivot table Excel.Range dataRange = xlSheet.UsedRange; // Row area and column area // Create pivot cache and pivot table Excel.PivotCache pivotCache = xlWorkbook.PivotCaches().Create( Excel.XlPivotTableSourceType.xlDatabase, dataRange, Type.Missing); Excel.PivotTable pivotTable = pivotCache.CreatePivotTable( xlPivotSheet.Cells[3, 1], "SalesPivot", Type.Missing, Type.Missing); // fields by field // Configure pivot table fields Excel.PivotField productField = (Excel.PivotField)pivotTable.PivotFields("Product"); productField.Orientation = Excel.XlPivotFieldOrientation.xlRowField; productField.Position = 1; Excel.PivotField regionField = (Excel.PivotField)pivotTable.PivotFields("Region"); regionField.Orientation = Excel.XlPivotFieldOrientation.xlColumnField; regionField.Position = 1; Excel.PivotField salesField = (Excel.PivotField)pivotTable.PivotFields("Sales"); pivotTable.AddDataField(salesField, "Sum of Sales", Excel.XlConsolidationFunction.xlSum); // Save and cleanup xlWorkbook.SaveAs(@"C:\Data\PivotReport.xlsx"); xlWorkbook.Close(); xlApp.Quit(); // Release COM objects to prevent memory leaks Marshal.ReleaseComObject(pivotTable); Marshal.ReleaseComObject(pivotCache); Marshal.ReleaseComObject(xlPivotSheet); Marshal.ReleaseComObject(xlSheet); Marshal.ReleaseComObject(xlWorkbook); Marshal.ReleaseComObject(xlApp); using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; // Create Excel application instance Excel.Application xlApp = new Excel.Application(); Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Data\SalesData.xlsx"); Excel.Worksheet xlSheet = (Excel.Worksheet)xlWorkbook.Sheets[1]; Excel.Worksheet xlPivotSheet = (Excel.Worksheet)xlWorkbook.Sheets.Add(); // Define data range for pivot table Excel.Range dataRange = xlSheet.UsedRange; // Row area and column area // Create pivot cache and pivot table Excel.PivotCache pivotCache = xlWorkbook.PivotCaches().Create( Excel.XlPivotTableSourceType.xlDatabase, dataRange, Type.Missing); Excel.PivotTable pivotTable = pivotCache.CreatePivotTable( xlPivotSheet.Cells[3, 1], "SalesPivot", Type.Missing, Type.Missing); // fields by field // Configure pivot table fields Excel.PivotField productField = (Excel.PivotField)pivotTable.PivotFields("Product"); productField.Orientation = Excel.XlPivotFieldOrientation.xlRowField; productField.Position = 1; Excel.PivotField regionField = (Excel.PivotField)pivotTable.PivotFields("Region"); regionField.Orientation = Excel.XlPivotFieldOrientation.xlColumnField; regionField.Position = 1; Excel.PivotField salesField = (Excel.PivotField)pivotTable.PivotFields("Sales"); pivotTable.AddDataField(salesField, "Sum of Sales", Excel.XlConsolidationFunction.xlSum); // Save and cleanup xlWorkbook.SaveAs(@"C:\Data\PivotReport.xlsx"); xlWorkbook.Close(); xlApp.Quit(); // Release COM objects to prevent memory leaks Marshal.ReleaseComObject(pivotTable); Marshal.ReleaseComObject(pivotCache); Marshal.ReleaseComObject(xlPivotSheet); Marshal.ReleaseComObject(xlSheet); Marshal.ReleaseComObject(xlWorkbook); Marshal.ReleaseComObject(xlApp); Imports Excel = Microsoft.Office.Interop.Excel Imports System.Runtime.InteropServices ' Create Excel application instance Dim xlApp As New Excel.Application() Dim xlWorkbook As Excel.Workbook = xlApp.Workbooks.Open("C:\Data\SalesData.xlsx") Dim xlSheet As Excel.Worksheet = CType(xlWorkbook.Sheets(1), Excel.Worksheet) Dim xlPivotSheet As Excel.Worksheet = CType(xlWorkbook.Sheets.Add(), Excel.Worksheet) ' Define data range for pivot table Dim dataRange As Excel.Range = xlSheet.UsedRange ' Create pivot cache and pivot table Dim pivotCache As Excel.PivotCache = xlWorkbook.PivotCaches().Create(Excel.XlPivotTableSourceType.xlDatabase, dataRange, Type.Missing) Dim pivotTable As Excel.PivotTable = pivotCache.CreatePivotTable(xlPivotSheet.Cells(3, 1), "SalesPivot", Type.Missing, Type.Missing) ' Configure pivot table fields Dim productField As Excel.PivotField = CType(pivotTable.PivotFields("Product"), Excel.PivotField) productField.Orientation = Excel.XlPivotFieldOrientation.xlRowField productField.Position = 1 Dim regionField As Excel.PivotField = CType(pivotTable.PivotFields("Region"), Excel.PivotField) regionField.Orientation = Excel.XlPivotFieldOrientation.xlColumnField regionField.Position = 1 Dim salesField As Excel.PivotField = CType(pivotTable.PivotFields("Sales"), Excel.PivotField) pivotTable.AddDataField(salesField, "Sum of Sales", Excel.XlConsolidationFunction.xlSum) ' Save and cleanup xlWorkbook.SaveAs("C:\Data\PivotReport.xlsx") xlWorkbook.Close() xlApp.Quit() ' Release COM objects to prevent memory leaks Marshal.ReleaseComObject(pivotTable) Marshal.ReleaseComObject(pivotCache) Marshal.ReleaseComObject(xlPivotSheet) Marshal.ReleaseComObject(xlSheet) Marshal.ReleaseComObject(xlWorkbook) Marshal.ReleaseComObject(xlApp) $vbLabelText $csharpLabel この Interop の例では、Product を行に、Region を列に、Sales をデータ領域に合計した Excel ネイティブのピボット・テーブルを作成します。 機能的ではありますが、このアプローチではMicrosoft Officeのインストールと注意深いCOMオブジェクトの管理が必要です。 Microsoft のドキュメントでは、このアプローチが最新ではない理由が説明されています。 DevOps観点から見ると、このアプローチは効果的にコンテナ化できないため特に問題があります。つまり、Microsoft Office をLinux Docker コンテナにインストールしたり、サーバーレス環境に展開したりすることはできません。 C#相互運用はどのような問題を引き起こしますか? Interop アプローチにはいくつかの重大な課題があり、最新のDevOpsプラクティスやクラウド ネイティブの展開には適していません。 残念ながら、Stack Overflow やその他のプログラミング Web サイトでは、2000 年代初頭のスレッドに縛られているため、引き続きこれを推奨しています。 展開の依存関係:運用サーバーを含む、ソースコードを実行するすべてのマシンに Microsoft Office がインストールされている必要があります。 これにより、ライセンスコストとデプロイメントの複雑さが加わります。 メモリ管理: COM オブジェクトは、Marshal.ReleaseComObject() を使用して明示的に解放する必要があります。 一つでもオブジェクトを見逃すと、Excelプロセスがメモリでハングしてしまうことが、Stack Overflowで広範に文書化されています。 ピボットキャッシュを考慮してください。 プラットフォームの制限: このソリューションは、Office がインストールされている Windows でのみ機能します。 非常に遅くなり、メモリリークが発生する可能性があります。 Linux 、 macOS 、Docker コンテナー、 Azure Functionsなどのクラウド プラットフォームはサポートされていません。 これにより、展開オプションが大幅に制限され、最新のコンテナ オーケストレーション プラットフォームの使用が妨げられます。 パフォーマンスの問題: Excel アプリケーション インスタンスの起動は遅く、特にサーバー側の処理では多くのリソースを消費します。 バージョン互換性: Office のバージョンによって COM インターフェイスが異なる場合があり、環境間で互換性の問題が発生します。 IronXLはどのようにインターロップなしでプログラム的にピボットテーブルを作成するのですか? IronXL は、COM 依存関係のないマネージ コードを使用して、ピボット テーブルの作成に異なるアプローチを採用しています。 ネイティブの Excel ピボット テーブルは作成しませんが、コンテナー化されたデプロイメントやクラウド ネイティブ アーキテクチャに最適な強力な集計機能を提供します。 ライブラリのパフォーマンス最適化には、速度が 40 倍向上し、メモリ使用量が 19.5 GB から 1 GB 未満に削減されるため、リソースが制限されたコンテナ環境に最適です。 このアプローチが XLSX または XLS ファイルに対して最新である理由は何ですか? using IronXL; using System.Linq; using System.Data; // Keep this namespace using static System.Data.DataTableExtensions; // Use 'using static' for DataTableExtensions class Program { static void Main(string[] args) { // Load Excel file - no Office required WorkBook workbook = WorkBook.Load("SalesData.xlsx"); WorkSheet dataSheet = workbook.WorkSheets[0]; // Convert to DataTable for powerful manipulation var dataTable = dataSheet.ToDataTable(true); // true = use first row as column headers // Create pivot-style aggregation using LINQ var pivotData = dataTable.AsEnumerable() .GroupBy(row => new { Product = row["Product"].ToString(), Region = row["Region"].ToString() }) //range .Select(g => new { Product = g.Key.Product, Region = g.Key.Region, TotalSales = g.Sum(row => Convert.ToDecimal(row["Sales"])), AverageSale = g.Average(row => Convert.ToDecimal(row["Sales"])), Count = g.Count() }); // Create pivot report worksheet WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport"); // Build cross-tabulation structure var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p); var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r); // Create headers pivotSheet["A1"].Value = "Product/Region"; int col = 2; foreach (var region in regions) { pivotSheet[$"{(char)('A' + col - 1)}1"].Value = region; // string col++; } // Populate pivot data int row = 2; foreach (var product in products) { pivotSheet[$"A{row}"].Value = product; col = 2; foreach (var region in regions) { var sales = pivotData .Where(p => p.Product == product && p.Region == region) .Select(p => p.TotalSales) .FirstOrDefault(); pivotSheet[$"{(char)('A' + col - 1)}{row}"].Value = sales; col++; } row++; } // Add totals using Excel formulas pivotSheet[$"A{row}"].Value = "Total"; // grand totals for (int c = 2; c <= regions.Count() + 1; c++) { pivotSheet[$"{(char)('A' + c - 1)}{row}"].Formula = $"=SUM({(char)('A' + c - 1)}2:{(char)('A' + c - 1)}{row - 1})"; } // Proceeding to apply formatting var dataRange = pivotSheet[$"B2:{(char)('A' + regions.Count())}{row}"]; dataRange.FormatString = "$#,##0.00"; workbook.SaveAs("PivotReport.xlsx"); } } using IronXL; using System.Linq; using System.Data; // Keep this namespace using static System.Data.DataTableExtensions; // Use 'using static' for DataTableExtensions class Program { static void Main(string[] args) { // Load Excel file - no Office required WorkBook workbook = WorkBook.Load("SalesData.xlsx"); WorkSheet dataSheet = workbook.WorkSheets[0]; // Convert to DataTable for powerful manipulation var dataTable = dataSheet.ToDataTable(true); // true = use first row as column headers // Create pivot-style aggregation using LINQ var pivotData = dataTable.AsEnumerable() .GroupBy(row => new { Product = row["Product"].ToString(), Region = row["Region"].ToString() }) //range .Select(g => new { Product = g.Key.Product, Region = g.Key.Region, TotalSales = g.Sum(row => Convert.ToDecimal(row["Sales"])), AverageSale = g.Average(row => Convert.ToDecimal(row["Sales"])), Count = g.Count() }); // Create pivot report worksheet WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport"); // Build cross-tabulation structure var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p); var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r); // Create headers pivotSheet["A1"].Value = "Product/Region"; int col = 2; foreach (var region in regions) { pivotSheet[$"{(char)('A' + col - 1)}1"].Value = region; // string col++; } // Populate pivot data int row = 2; foreach (var product in products) { pivotSheet[$"A{row}"].Value = product; col = 2; foreach (var region in regions) { var sales = pivotData .Where(p => p.Product == product && p.Region == region) .Select(p => p.TotalSales) .FirstOrDefault(); pivotSheet[$"{(char)('A' + col - 1)}{row}"].Value = sales; col++; } row++; } // Add totals using Excel formulas pivotSheet[$"A{row}"].Value = "Total"; // grand totals for (int c = 2; c <= regions.Count() + 1; c++) { pivotSheet[$"{(char)('A' + c - 1)}{row}"].Formula = $"=SUM({(char)('A' + c - 1)}2:{(char)('A' + c - 1)}{row - 1})"; } // Proceeding to apply formatting var dataRange = pivotSheet[$"B2:{(char)('A' + regions.Count())}{row}"]; dataRange.FormatString = "$#,##0.00"; workbook.SaveAs("PivotReport.xlsx"); } } Imports IronXL Imports System.Linq Imports System.Data ' Keep this namespace Imports static System.Data.DataTableExtensions ' Use 'using static' for DataTableExtensions Module Program Sub Main(args As String()) ' Load Excel file - no Office required Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx") Dim dataSheet As WorkSheet = workbook.WorkSheets(0) ' Convert to DataTable for powerful manipulation Dim dataTable = dataSheet.ToDataTable(True) ' true = use first row as column headers ' Create pivot-style aggregation using LINQ Dim pivotData = dataTable.AsEnumerable() _ .GroupBy(Function(row) New With { Key .Product = row("Product").ToString(), Key .Region = row("Region").ToString() }) _ .Select(Function(g) New With { Key .Product = g.Key.Product, Key .Region = g.Key.Region, Key .TotalSales = g.Sum(Function(row) Convert.ToDecimal(row("Sales"))), Key .AverageSale = g.Average(Function(row) Convert.ToDecimal(row("Sales"))), Key .Count = g.Count() }) ' Create pivot report worksheet Dim pivotSheet As WorkSheet = workbook.CreateWorkSheet("PivotReport") ' Build cross-tabulation structure Dim products = pivotData.Select(Function(p) p.Product).Distinct().OrderBy(Function(p) p) Dim regions = pivotData.Select(Function(p) p.Region).Distinct().OrderBy(Function(r) r) ' Create headers pivotSheet("A1").Value = "Product/Region" Dim col As Integer = 2 For Each region In regions pivotSheet($"{ChrW(AscW("A"c) + col - 1)}1").Value = region ' string col += 1 Next ' Populate pivot data Dim row As Integer = 2 For Each product In products pivotSheet($"A{row}").Value = product col = 2 For Each region In regions Dim sales = pivotData _ .Where(Function(p) p.Product = product AndAlso p.Region = region) _ .Select(Function(p) p.TotalSales) _ .FirstOrDefault() pivotSheet($"{ChrW(AscW("A"c) + col - 1)}{row}").Value = sales col += 1 Next row += 1 Next ' Add totals using Excel formulas pivotSheet($"A{row}").Value = "Total" ' grand totals For c As Integer = 2 To regions.Count() + 1 pivotSheet($"{ChrW(AscW("A"c) + c - 1)}{row}").Formula = $"=SUM({ChrW(AscW("A"c) + c - 1)}2:{ChrW(AscW("A"c) + c - 1)}{row - 1})" Next ' Proceeding to apply formatting Dim dataRange = pivotSheet($"B2:{ChrW(AscW("A"c) + regions.Count())}{row}") dataRange.FormatString = "$#,##0.00" workbook.SaveAs("PivotReport.xlsx") End Sub End Module $vbLabelText $csharpLabel これは、コンテナーに適した方法でピボット テーブルを作成する方法です。 このアプローチは、外部依存関係なしで、Docker コンテナ、Kubernetes ポッド、サーバーレス関数でシームレスに機能します。 アプリケーション全体を、.NET がサポートされている場所であればどこでも実行できる軽量のコンテナー イメージにパッケージ化できます。 ピボット テーブルの出力はどのようになりますか? ! 元のExcel売上データと、地域別に集計された製品売上と合計を示す生成されたピボットテーブルの比較 出力は、Excel をインストールせずに IronXL が生の販売データを構造化されたピボット レポートに変換する方法を示しており、CI/CD パイプラインでの自動レポートに最適です。 IronXLの式を使用して動的なサマリーを作成する方法? ピボット テーブルの更新機能と同様の動的な更新を必要とするシナリオでは、IronXL はExcel の組み込み数式を活用できます。 このアプローチが推奨されます。データはより現代的でエレガントな方法で処理されます。 コードは簡単に理解でき、サポートに連絡したりマニュアルを読んだりする必要もなくセットアップできます。 このアプローチは、自動的に更新される数式ベースの計算が必要なコンテナー化された環境で特に役立ちます。 数式ベースの要約はどのように自動的に更新されるのでしょうか? // Load the workbook WorkBook workbook = WorkBook.Load(inputPath); // Rename the first worksheet so formulas reference correctly WorkSheet dataSheet = workbook.WorkSheets[0]; dataSheet.Name = "DataSheet"; // Convert worksheet to DataTable DataTable dataTable = dataSheet.ToDataTable(true); // Create new summary worksheet WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary"); // Get unique product-region combinations var uniqueCombos = dataTable.AsEnumerable() .Select(row => new { Product = row["Product"].ToString(), Region = row["Region"].ToString() }) .Distinct() .OrderBy(x => x.Product) .ThenBy(x => x.Region); // Add header row summarySheet["A1"].Value = "Product"; summarySheet["B1"].Value = "Region"; summarySheet["C1"].Value = "Total Sales"; summarySheet["D1"].Value = "Count"; // Populate rows with formulas int rowIndex = 2; foreach (var combo in uniqueCombos) { summarySheet[$"A{rowIndex}"].Value = combo.Product; summarySheet[$"B{rowIndex}"].Value = combo.Region; // Adjust column references if your Sales column is C (not D) summarySheet[$"C{rowIndex}"].Formula = $"=SUMIFS(DataSheet!C:C,DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; summarySheet[$"D{rowIndex}"].Formula = $"=COUNTIFS(DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; rowIndex++; } // Optional: add total row summarySheet[$"A{rowIndex}"].Value = "Total"; summarySheet[$"C{rowIndex}"].Formula = $"=SUM(C2:C{rowIndex - 1})"; summarySheet[$"D{rowIndex}"].Formula = $"=SUM(D2:D{rowIndex - 1})"; // Save output file workbook.SaveAs(outputPath); //filename // Load the workbook WorkBook workbook = WorkBook.Load(inputPath); // Rename the first worksheet so formulas reference correctly WorkSheet dataSheet = workbook.WorkSheets[0]; dataSheet.Name = "DataSheet"; // Convert worksheet to DataTable DataTable dataTable = dataSheet.ToDataTable(true); // Create new summary worksheet WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary"); // Get unique product-region combinations var uniqueCombos = dataTable.AsEnumerable() .Select(row => new { Product = row["Product"].ToString(), Region = row["Region"].ToString() }) .Distinct() .OrderBy(x => x.Product) .ThenBy(x => x.Region); // Add header row summarySheet["A1"].Value = "Product"; summarySheet["B1"].Value = "Region"; summarySheet["C1"].Value = "Total Sales"; summarySheet["D1"].Value = "Count"; // Populate rows with formulas int rowIndex = 2; foreach (var combo in uniqueCombos) { summarySheet[$"A{rowIndex}"].Value = combo.Product; summarySheet[$"B{rowIndex}"].Value = combo.Region; // Adjust column references if your Sales column is C (not D) summarySheet[$"C{rowIndex}"].Formula = $"=SUMIFS(DataSheet!C:C,DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; summarySheet[$"D{rowIndex}"].Formula = $"=COUNTIFS(DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; rowIndex++; } // Optional: add total row summarySheet[$"A{rowIndex}"].Value = "Total"; summarySheet[$"C{rowIndex}"].Formula = $"=SUM(C2:C{rowIndex - 1})"; summarySheet[$"D{rowIndex}"].Formula = $"=SUM(D2:D{rowIndex - 1})"; // Save output file workbook.SaveAs(outputPath); //filename Imports System.Data Imports System.Linq ' Load the workbook Dim workbook As WorkBook = WorkBook.Load(inputPath) ' Rename the first worksheet so formulas reference correctly Dim dataSheet As WorkSheet = workbook.WorkSheets(0) dataSheet.Name = "DataSheet" ' Convert worksheet to DataTable Dim dataTable As DataTable = dataSheet.ToDataTable(True) ' Create new summary worksheet Dim summarySheet As WorkSheet = workbook.CreateWorkSheet("DynamicSummary") ' Get unique product-region combinations Dim uniqueCombos = dataTable.AsEnumerable() _ .Select(Function(row) New With { .Product = row("Product").ToString(), .Region = row("Region").ToString() }) _ .Distinct() _ .OrderBy(Function(x) x.Product) _ .ThenBy(Function(x) x.Region) ' Add header row summarySheet("A1").Value = "Product" summarySheet("B1").Value = "Region" summarySheet("C1").Value = "Total Sales" summarySheet("D1").Value = "Count" ' Populate rows with formulas Dim rowIndex As Integer = 2 For Each combo In uniqueCombos summarySheet($"A{rowIndex}").Value = combo.Product summarySheet($"B{rowIndex}").Value = combo.Region ' Adjust column references if your Sales column is C (not D) summarySheet($"C{rowIndex}").Formula = $"=SUMIFS(DataSheet!C:C,DataSheet!A:A,""{combo.Product}"",DataSheet!B:B,""{combo.Region}"")" summarySheet($"D{rowIndex}").Formula = $"=COUNTIFS(DataSheet!A:A,""{combo.Product}"",DataSheet!B:B,""{combo.Region}"")" rowIndex += 1 Next ' Optional: add total row summarySheet($"A{rowIndex}").Value = "Total" summarySheet($"C{rowIndex}").Formula = $"=SUM(C2:C{rowIndex - 1})" summarySheet($"D{rowIndex}").Formula = $"=SUM(D2:D{rowIndex - 1})" ' Save output file workbook.SaveAs(outputPath) ' filename $vbLabelText $csharpLabel これらの数式は、ソースデータへのライブ接続を維持し、データシートが変更されると自動的に更新されます - ピボットテーブルのリフレッシュ動作と似ていますが、Interopの依存関係はありません。 このアプローチは、外部依存なしに動的なレポートを生成する必要があるコンテナ化されたマイクロサービスに最適です。 動的サマリーからどのような結果が期待できますか? このコードを前の例の Excel ファイルに適用すると、次の出力が得られます。 ! Excel スプレッドシートに、地域別の製品 (ラップトップ、電話、タブレット) の合計とカウントを表示する動的な集計式を使用して、製品の売上データを表示します。 動的サマリー アプローチでは、ソース データが変更されると自動的に更新されるリアルタイム計算が提供されるため、コンテナー化された環境での自動レポート パイプラインに最適です。 これにより、スケジュールされたピボット テーブルの更新が不要になり、 .NET MAUIおよびBlazorアプリケーションでシームレスに動作します。 ピボット テーブルについて C# 相互運用性 と IronXL をどのように比較すればよいでしょうか? アスペクト C# 相互運用性 IronXL オフィス必須 はい - フルインストール いいえ - スタンドアロンライブラリ プラットフォームサポート Windowsのみ Windows、Linux、macOS、Docker メモリ管理 手動のCOMクリーンアップが必要 自動 .NET ガベージコレクション デプロイメント 複雑 - Officeライセンス シンプル - 単一のDLL パフォーマンス 遅い - Excel プロセスの起動 高速 - メモリ内計算 クラウド対応 いいえ - Azure の制限 はい - Azure Functions のサポート ネイティブピボットテーブル はい いいえ - 集約の代替手段 開発スピード 遅い - COMの複雑さ 高速 - 直感的なAPI コンテナサポート いいえ - Office をコンテナ化できません はい - Docker対応 健康診断 困難 - COMプロセスの監視 簡単 - 標準的な.NET監視 DevOps観点から見ると、IronXL のアーキテクチャは、最新の展開シナリオに大きな利点をもたらします。 ライブラリは外部依存関係なしでコンテナ内で実行できるため、迅速にデプロイして効率的に拡張できる軽量の Docker イメージを作成できます。 ヘルス チェックは標準の .NET パターンを使用して実装でき、ライブラリのセキュリティ機能にはDigiCert認証と COM インターフェイスが含まれないため、攻撃ベクトルが削減されます。 どのアプローチを選ぶべきか? C# 相互運用性 はいつ使用すべきでしょうか? C# 相互運用性を選択する場合: ネイティブなExcelピボットテーブルオブジェクトが絶対に必要 どこにでもOfficeがインストールされたWindowsのみで作業する 管理するデスクトップ システムにのみ展開 既存のレガシーコードがInteropに依存している 従来の.NET Frameworkバージョンの使用 コンテナ化やクラウドへの移行の予定はありません IronXL はいつより良い結果をもたらしますか? IronXLを選択する場合: サーバーまたはクラウド環境(Azure、AWS)へのデプロイ コンテナ内で実行されるクロスプラットフォームアプリケーションの構築 40倍の速度向上による優れたパフォーマンスが必要 Office ライセンスのコストと導入の複雑さを回避 自動ライセンスキー管理を備えたよりシンプルなコードが必要 Mac、iOS、Android、Linuxシステムをサポート 最新の .NET Core および .NET 5-10 での作業 ピボットテーブルフィールドをプログラムで構成する *さまざまな形式にエクスポートするマイクロサービスの構築 CI/CDパイプラインに自動レポートを実装する コンテナオーケストレーションのヘルスチェックエンドポイントの作成 *異なるスプレッドシート形式間の変換 C# でピボット テーブルを作成する方法について何を学びましたか? C# Excel Interop ではネイティブのピボット テーブルを作成できますが、展開上の制限と複雑さにより、特にコンテナー化された環境では、最新のアプリケーションにはますます実用的ではなくなってきています。 IronXL は、データ集約と数式ベースの要約を通じて強力な代替手段を提供し、分析機能を維持しながら Office への依存を排除します。 Interop なしでピボット テーブルを開発する代わりの方法を探している開発者やDevOpsエンジニアにとって、IronXL は COM の複雑さを回避し、すべてのプラットフォームで動作し、展開を簡素化する優れた方法を提供します。 ネイティブピボットオブジェクトがないことのトレードオフは、より柔軟性が高く、パフォーマンスが向上し、Officeライセンス要件が排除されることで相殺されます。 DevOpsチームにとって最も重要なのは、IronXL により、コンテナ化されたデプロイメント、自動スケーリング、最新の CI/CD パイプラインとのシームレスな統合により、真のインフラストラクチャをコードとして実現できることです。 ライブラリの包括的な機能セットには、条件付き書式、セルのスタイル設定、数式のサポート、 データの検証が含まれており、最新の .NET アプリケーションでの Excel 自動化のための完全なソリューションとなっています。 CSV ファイルの操作、ワークシートの管理、複雑なデータ変換の実装など、どのような場合でも、IronXL は一貫性があり、展開しやすい API を提供します。 今IronXLを始めましょう。 無料で始める Excel の自動化を最新化し、最新の C# でピボット テーブル コードを作成する準備はできていますか? IronXLはNuGetパッケージ・マネージャーを通して、あなたのC#アプリケーションに数秒で実装することができます。 無料トライアルを試して、運用アプリケーションの相互運用性依存関係を排除し、コンテナの展開を簡素化してください。 よくある質問 Excelにおけるピボットテーブルとは何? Excelのピボットテーブルは、データを要約し、分析し、調査し、提示するための強力なツールです。これにより、列を行に変換したり、その逆を行ったりすることで、動的なデータ分析が可能になります。 C#でExcelのピボットテーブルを作成するためにIronXLを使用する理由は? IronXLは、Office Interopに依存せずにC#でExcelピボットテーブルを作成することを可能にし、Excelのインストールを必要とせず、依存関係を削減し、現代的で効率的な選択肢となります。 IronXLはExcel操作においてC# Interopとどのように比較されますか? IronXLは、Officeのインストールを必要とするC# Interopと比較して、より簡潔で独立したアプローチを提供します。IronXLは、Interopの複雑さなしにピボットテーブルやその他のExcel操作の作成を簡素化します。 Excelがインストールされていない場合でもピボットテーブルを生成できますか? はい、IronXLを使用すると、Microsoft Officeに独立して動作するため、Excelがインストールされていなくても、C#アプリケーション内でピボットテーブルを生成できます。 IronXLは大規模なデータセットに適していますか? IronXLは大規模なデータセットを効率的に処理するよう設計されているため、強力なデータ操作とピボットテーブル生成を必要とするアプリケーションに適しています。 IronXLを従来の方法よりも使用する利点は何ですか? IronXLは、C# Interopのような従来の方法に対する現代の、依存関係のない代替手段を提供し、使いやすさ、柔軟性、Excelのインストールを必要とせずに複雑なデータ操作をサポートします。 IronXLでピボットテーブルを使用するためにVBAを学ぶ必要がありますか? いいえ、IronXLを使用すると、開発者はC#内で直接ピボットテーブルを作成および管理できるため、VBAや他のExcel特有のプログラミング言語を学ぶ必要がありません。 カーティス・チャウ 今すぐエンジニアリングチームとチャット テクニカルライター Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。 関連する記事 公開日 2026年2月15日 C#でOleDbとIronXLを使用してDataTableをExcelにエクスポートする方法 C#でOleDbとIronXLを使用してDataTableをExcelにエクスポートする方法を学びます。 詳しく読む 公開日 2026年2月15日 IronXLを使用してOfficeがインストールされていないVB.NETで既存のExcelファイルを開く方法 IronXLを使用して、OfficeがインストールされていないVB.NETで既存のExcelファイルを開く方法について説明します。 詳しく読む 公開日 2026年2月15日 C# CSV to XLSX: 完全な開発者ガイド IronXLを使用してC#でCSVをXLSXに変換します。CSVファイルを読み込み、データ型を保持し、グラフを追加し、Microsoft Officeに依存せずにExcel形式にエクスポートします。 詳しく読む VB.NETで`DataGridView`をExcelにエクスポートする方法IronXLを使用してC#でCSVにデ...
公開日 2026年2月15日 C#でOleDbとIronXLを使用してDataTableをExcelにエクスポートする方法 C#でOleDbとIronXLを使用してDataTableをExcelにエクスポートする方法を学びます。 詳しく読む
公開日 2026年2月15日 IronXLを使用してOfficeがインストールされていないVB.NETで既存のExcelファイルを開く方法 IronXLを使用して、OfficeがインストールされていないVB.NETで既存のExcelファイルを開く方法について説明します。 詳しく読む
公開日 2026年2月15日 C# CSV to XLSX: 完全な開発者ガイド IronXLを使用してC#でCSVをXLSXに変換します。CSVファイルを読み込み、データ型を保持し、グラフを追加し、Microsoft Officeに依存せずにExcel形式にエクスポートします。 詳しく読む