IRONXLの使用 Officeに依存せずにC#を使用してExcelでピボットテーブルを作成するには? カーティス・チャウ 更新日:2026年1月5日 IronXL をダウンロード NuGet ダウンロード DLL ダウンロード 無料トライアル LLM向けのコピー LLM向けのコピー LLM 用の Markdown としてページをコピーする ChatGPTで開く このページについてChatGPTに質問する ジェミニで開く このページについてGeminiに問い合わせる Grokで開く このページについてGrokに質問する 困惑の中で開く このページについてPerplexityに問い合わせる 共有する Facebook で共有 Xでシェア(Twitter) LinkedIn で共有 URLをコピー 記事をメールで送る 従来、C# でプログラム的にピボット テーブルを作成するには、複雑な COM 管理を伴う Office Interop が必要でしたが、 IronXLなどの最新のライブラリを使用すると、Office をインストールせずにクロスプラットフォームのピボット テーブルを生成でき、メモリ リークを排除しながら Docker コンテナーとクラウド展開がサポートされます。 プログラムでピボット テーブルを生成するには、Office 依存関係を持つ C# Interop か、独立して動作するIronXLなどの最新ライブラリが必要です。 このチュートリアルでは、両方のアプローチについて説明し、開発者が従来の方法よりもIronXL のコンテナ対応ソリューションを選択する理由を強調します。 この記事では、自動分析とエラー処理を使用してピボット テーブルを編集、作成、設計、計算する方法を学習します。 このガイドでは、AWS にデプロイする場合でも、 Azure で実行する場合でも、Excel 自動化の最新のアプローチについて説明します。 Excelのピボットテーブルとは何ですか? データ分析においてピボットテーブルが重要なのはなぜですか? ピボット テーブルは、大規模なデータセットを要約するための Excel の最も強力なツールの 1 つです。 数値データを簡単に表示、理解、分析する方法を提供します。 ピボット テーブルは、Excel だけでなく、Google Sheets、Apple Numbers、CSV エクスポートでも利用できます。 基礎となる情報にリンクするインタラクティブな要約を作成することで、生のデータを意味のある洞察に変換します。 C# で Excel の数式を扱う開発者にとって、ピボット テーブルは重要な集計機能となります。 単一のセルに対して動作する基本的な数学関数とは異なり、ピボット テーブルではデータセット全体のExcel 関数を集計できます。 ピボット テーブルと通常のレポートはいつ使用すればよいですか? ピボット テーブルを間違った方法で作成する方法を調べ、次に C# で正しい方法を学びましょう。 C#インターオプを使用してExcelテーブルでピボットテーブルを作成するには? Interop には制限があるにもかかわらず、なぜまだ使用されているのでしょうか? C# Excel Interopは、COMオートメーションを通じてExcelのピボットテーブル機能への直接アクセスを提供します。 C#でピボットテーブル生成を検索するときに多くの開発者が見つける従来のアプローチは次のとおりです。(非推奨) .NETで昔ながらの方法でピボットテーブルを作成する方法 using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; // Create Excel application instance - requires Office installation 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; // Create pivot cache and pivot table - COM objects require explicit cleanup 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); // Configure pivot table fields - traditional row/column/data setup 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 - critical for preventing memory leaks xlWorkbook.SaveAs(@"C:\Data\PivotReport.xlsx"); xlWorkbook.Close(); xlApp.Quit(); // Release COM objects to prevent memory leaks - must release in reverse order 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 - requires Office installation 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; // Create pivot cache and pivot table - COM objects require explicit cleanup 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); // Configure pivot table fields - traditional row/column/data setup 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 - critical for preventing memory leaks xlWorkbook.SaveAs(@"C:\Data\PivotReport.xlsx"); xlWorkbook.Close(); xlApp.Quit(); // Release COM objects to prevent memory leaks - must release in reverse order 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 - requires Office installation 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 - COM objects require explicit cleanup 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 - traditional row/column/data setup 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 - critical for preventing memory leaks xlWorkbook.SaveAs("C:\Data\PivotReport.xlsx") xlWorkbook.Close() xlApp.Quit() ' Release COM objects to prevent memory leaks - must release in reverse order 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 自身のドキュメントでは、最新の開発ではこのアプローチを推奨していません。 コンテナー化された展開では、相互運用性なしで Excel を操作することが不可欠です。 COM オブジェクトが適切に解放されない場合、何が起こりますか? C#相互運用はどのような問題を引き起こしますか? コンテナ化された環境で相互運用性が失敗する理由は何ですか? Interop アプローチは、最新のDevOpsプラクティスとDocker セットアップにいくつかの重大な課題をもたらします。 展開の依存関係:運用サーバーを含む、ソース コードを実行するすべてのマシンに Microsoft Office がインストールされている必要があります。 これにより、ライセンスコストとデプロイメントの複雑さが加わります。 メモリ管理: COM オブジェクトは、 Marshal.ReleaseComObject()を使用して明示的に解放する必要があります。 一つでもオブジェクトを見逃すと、Excelプロセスがメモリでハングしてしまうことが、Stack Overflowで広範に文書化されています。 プラットフォームの制限の詳細:この旧式のソリューションは、Office がインストールされている Windows でのみ動作し、非常に遅く、ユーザーを混乱させ、メモリ リークを引き起こす可能性があります。 Linux、macOS、Dockerコンテナ、またはAzure Functionsのようなクラウドプラットフォームをサポートしていません。 パフォーマンスの問題: Excel アプリケーション インスタンスの起動は遅く、特にサーバー側の処理では多くのリソースを消費します。 バージョン互換性: Office のバージョンによって COM インターフェイスが異なる場合があり、環境間で互換性の問題が発生します。 IronXLはどのようにインターロップなしでプログラム的にピボットテーブルを作成するのですか? IronXLは、COM依存関係なしでの管理コードを使用してピボットテーブルの作成に異なるアプローチを取ります。 ネイティブのExcelピボットテーブルは作成できませんが、強力な集計機能を提供します。 最新の方法で XLSX または XLS ピボットテーブルをプログラムで作成する方法 using IronXL; using System.Linq; using System.Data; // Essential for DataTable manipulation using static System.Data.DataTableExtensions; // Extension methods for LINQ queries class Program { static void Main(string[] args) { // Load Excel file - works on all platforms without Office WorkBook workbook = WorkBook.Load("SalesData.xlsx"); WorkSheet dataSheet = workbook.WorkSheets[0]; // Convert to DataTable for powerful manipulation - maintains data types var dataTable = dataSheet.ToDataTable(true); // true = use first row as column headers // Create pivot-style aggregation using LINQ - no COM objects needed var pivotData = dataTable.AsEnumerable() .GroupBy(row => new { Product = row["Product"].ToString(), Region = row["Region"].ToString() }) // Group by multiple dimensions .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 - no Excel process started WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport"); // Build cross-tabulation structure programmatically var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p); var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r); // Create headers with formatting options pivotSheet["A1"].Value = "Product/Region"; int col = 2; foreach (var region in regions) { pivotSheet[$"{(char)('A' + col - 1)}1"].Value = region; // Dynamic column addressing col++; } // Populate pivot data - memory efficient for large datasets 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 - maintains live calculations pivotSheet[$"A{row}"].Value = "Total"; // Grand totals row for (int c = 2; c <= regions.Count() + 1; c++) { // Formula references ensure dynamic updates pivotSheet[$"{(char)('A' + c - 1)}{row}"].Formula = $"=SUM({(char)('A' + c - 1)}2:{(char)('A' + c - 1)}{row - 1})"; } // Apply professional formatting - currency format for sales data var dataRange = pivotSheet[$"B2:{(char)('A' + regions.Count())}{row}"]; dataRange.FormatString = "$#,##0.00"; // Save without Office dependencies - works in containers workbook.SaveAs("PivotReport.xlsx"); } } using IronXL; using System.Linq; using System.Data; // Essential for DataTable manipulation using static System.Data.DataTableExtensions; // Extension methods for LINQ queries class Program { static void Main(string[] args) { // Load Excel file - works on all platforms without Office WorkBook workbook = WorkBook.Load("SalesData.xlsx"); WorkSheet dataSheet = workbook.WorkSheets[0]; // Convert to DataTable for powerful manipulation - maintains data types var dataTable = dataSheet.ToDataTable(true); // true = use first row as column headers // Create pivot-style aggregation using LINQ - no COM objects needed var pivotData = dataTable.AsEnumerable() .GroupBy(row => new { Product = row["Product"].ToString(), Region = row["Region"].ToString() }) // Group by multiple dimensions .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 - no Excel process started WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport"); // Build cross-tabulation structure programmatically var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p); var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r); // Create headers with formatting options pivotSheet["A1"].Value = "Product/Region"; int col = 2; foreach (var region in regions) { pivotSheet[$"{(char)('A' + col - 1)}1"].Value = region; // Dynamic column addressing col++; } // Populate pivot data - memory efficient for large datasets 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 - maintains live calculations pivotSheet[$"A{row}"].Value = "Total"; // Grand totals row for (int c = 2; c <= regions.Count() + 1; c++) { // Formula references ensure dynamic updates pivotSheet[$"{(char)('A' + c - 1)}{row}"].Formula = $"=SUM({(char)('A' + c - 1)}2:{(char)('A' + c - 1)}{row - 1})"; } // Apply professional formatting - currency format for sales data var dataRange = pivotSheet[$"B2:{(char)('A' + regions.Count())}{row}"]; dataRange.FormatString = "$#,##0.00"; // Save without Office dependencies - works in containers workbook.SaveAs("PivotReport.xlsx"); } } Imports IronXL Imports System.Linq Imports System.Data ' Essential for DataTable manipulation Imports System.Data.DataTableExtensions ' Extension methods for LINQ queries Module Program Sub Main(args As String()) ' Load Excel file - works on all platforms without Office Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx") Dim dataSheet As WorkSheet = workbook.WorkSheets(0) ' Convert to DataTable for powerful manipulation - maintains data types Dim dataTable = dataSheet.ToDataTable(True) ' True = use first row as column headers ' Create pivot-style aggregation using LINQ - no COM objects needed Dim pivotData = dataTable.AsEnumerable() _ .GroupBy(Function(row) New With { Key .Product = row("Product").ToString(), Key .Region = row("Region").ToString() }) _ .Select(Function(g) New With { .Product = g.Key.Product, .Region = g.Key.Region, .TotalSales = g.Sum(Function(row) Convert.ToDecimal(row("Sales"))), .AverageSale = g.Average(Function(row) Convert.ToDecimal(row("Sales"))), .Count = g.Count() }) ' Create pivot report worksheet - no Excel process started Dim pivotSheet As WorkSheet = workbook.CreateWorkSheet("PivotReport") ' Build cross-tabulation structure programmatically 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 with formatting options pivotSheet("A1").Value = "Product/Region" Dim col As Integer = 2 For Each region In regions pivotSheet($"{ChrW(Asc("A"c) + col - 1)}1").Value = region ' Dynamic column addressing col += 1 Next ' Populate pivot data - memory efficient for large datasets 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(Asc("A"c) + col - 1)}{row}").Value = sales col += 1 Next row += 1 Next ' Add totals using Excel formulas - maintains live calculations pivotSheet($"A{row}").Value = "Total" ' Grand totals row For c As Integer = 2 To regions.Count() + 1 ' Formula references ensure dynamic updates pivotSheet($"{ChrW(Asc("A"c) + c - 1)}{row}").Formula = $"=SUM({ChrW(Asc("A"c) + c - 1)}2:{ChrW(Asc("A"c) + c - 1)}{row - 1})" Next ' Apply professional formatting - currency format for sales data Dim dataRange = pivotSheet($"B2:{ChrW(Asc("A"c) + regions.Count())}{row}") dataRange.FormatString = "$#,##0.00" ' Save without Office dependencies - works in containers workbook.SaveAs("PivotReport.xlsx") End Sub End Module $vbLabelText $csharpLabel この最新のアプローチにより、Docker コンテナーでシームレスに動作し、さまざまな Excel 形式をサポートするピボット テーブルが作成されます。 CSV 、 JSON、XMLなどのさまざまな形式にエクスポートすることもできます。 出力はどのようになりますか? IronXLの式を使用して動的なサマリーを作成する方法? 静的集計の代わりに数式を使用する必要があるのはどのような場合ですか? ピボット テーブルの更新機能と同様の動的な更新を必要とするシナリオでは、IronXL はExcel の組み込み数式を活用できます。 このアプローチは、マニュアルやサポートがなくても理解しやすいコードを備えており、よりエレガントで保守性に優れています。 条件付き書式を使用して視覚的にデータを表示すると効果的です。 数式ベースの集計ではデータ接続がどのように維持されるのでしょうか? // Load the workbook - container-friendly approach WorkBook workbook = WorkBook.Load(inputPath); // Rename the first worksheet so formulas reference correctly WorkSheet dataSheet = workbook.WorkSheets[0]; dataSheet.Name = "DataSheet"; // Named reference for formulas // Convert worksheet to DataTable for efficient processing DataTable dataTable = dataSheet.ToDataTable(true); // Create new summary worksheet - no COM objects WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary"); // Get unique product-region combinations using LINQ 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 with proper formatting summarySheet["A1"].Value = "Product"; summarySheet["B1"].Value = "Region"; summarySheet["C1"].Value = "Total Sales"; summarySheet["D1"].Value = "Count"; // Populate rows with formulas - maintains live data connection int rowIndex = 2; foreach (var combo in uniqueCombos) { summarySheet[$"A{rowIndex}"].Value = combo.Product; summarySheet[$"B{rowIndex}"].Value = combo.Region; // SUMIFS formula for conditional aggregation summarySheet[$"C{rowIndex}"].Formula = $"=SUMIFS(DataSheet!C:C,DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; // COUNTIFS for record counting summarySheet[$"D{rowIndex}"].Formula = $"=COUNTIFS(DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; rowIndex++; } // Optional: add total row with grand totals summarySheet[$"A{rowIndex}"].Value = "Total"; summarySheet[$"C{rowIndex}"].Formula = $"=SUM(C2:C{rowIndex - 1})"; summarySheet[$"D{rowIndex}"].Formula = $"=SUM(D2:D{rowIndex - 1})"; // Apply number formatting for professional appearance var salesColumn = summarySheet[$"C2:C{rowIndex}"]; salesColumn.FormatString = "$#,##0.00"; // Save output file - works in any environment workbook.SaveAs(outputPath); // No Office required // Load the workbook - container-friendly approach WorkBook workbook = WorkBook.Load(inputPath); // Rename the first worksheet so formulas reference correctly WorkSheet dataSheet = workbook.WorkSheets[0]; dataSheet.Name = "DataSheet"; // Named reference for formulas // Convert worksheet to DataTable for efficient processing DataTable dataTable = dataSheet.ToDataTable(true); // Create new summary worksheet - no COM objects WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary"); // Get unique product-region combinations using LINQ 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 with proper formatting summarySheet["A1"].Value = "Product"; summarySheet["B1"].Value = "Region"; summarySheet["C1"].Value = "Total Sales"; summarySheet["D1"].Value = "Count"; // Populate rows with formulas - maintains live data connection int rowIndex = 2; foreach (var combo in uniqueCombos) { summarySheet[$"A{rowIndex}"].Value = combo.Product; summarySheet[$"B{rowIndex}"].Value = combo.Region; // SUMIFS formula for conditional aggregation summarySheet[$"C{rowIndex}"].Formula = $"=SUMIFS(DataSheet!C:C,DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; // COUNTIFS for record counting summarySheet[$"D{rowIndex}"].Formula = $"=COUNTIFS(DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")"; rowIndex++; } // Optional: add total row with grand totals summarySheet[$"A{rowIndex}"].Value = "Total"; summarySheet[$"C{rowIndex}"].Formula = $"=SUM(C2:C{rowIndex - 1})"; summarySheet[$"D{rowIndex}"].Formula = $"=SUM(D2:D{rowIndex - 1})"; // Apply number formatting for professional appearance var salesColumn = summarySheet[$"C2:C{rowIndex}"]; salesColumn.FormatString = "$#,##0.00"; // Save output file - works in any environment workbook.SaveAs(outputPath); // No Office required Imports System.Data Imports System.Linq ' Load the workbook - container-friendly approach 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" ' Named reference for formulas ' Convert worksheet to DataTable for efficient processing Dim dataTable As DataTable = dataSheet.ToDataTable(True) ' Create new summary worksheet - no COM objects Dim summarySheet As WorkSheet = workbook.CreateWorkSheet("DynamicSummary") ' Get unique product-region combinations using LINQ 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 with proper formatting summarySheet("A1").Value = "Product" summarySheet("B1").Value = "Region" summarySheet("C1").Value = "Total Sales" summarySheet("D1").Value = "Count" ' Populate rows with formulas - maintains live data connection Dim rowIndex As Integer = 2 For Each combo In uniqueCombos summarySheet($"A{rowIndex}").Value = combo.Product summarySheet($"B{rowIndex}").Value = combo.Region ' SUMIFS formula for conditional aggregation summarySheet($"C{rowIndex}").Formula = $"=SUMIFS(DataSheet!C:C,DataSheet!A:A,""{combo.Product}"",DataSheet!B:B,""{combo.Region}"")" ' COUNTIFS for record counting summarySheet($"D{rowIndex}").Formula = $"=COUNTIFS(DataSheet!A:A,""{combo.Product}"",DataSheet!B:B,""{combo.Region}"")" rowIndex += 1 Next ' Optional: add total row with grand totals summarySheet($"A{rowIndex}").Value = "Total" summarySheet($"C{rowIndex}").Formula = $"=SUM(C2:C{rowIndex - 1})" summarySheet($"D{rowIndex}").Formula = $"=SUM(D2:D{rowIndex - 1})" ' Apply number formatting for professional appearance Dim salesColumn = summarySheet($"C2:C{rowIndex}") salesColumn.FormatString = "$#,##0.00" ' Save output file - works in any environment workbook.SaveAs(outputPath) ' No Office required $vbLabelText $csharpLabel これらの数式は、ソース データへのライブ接続を維持し、データ シートが変更されると自動的に更新されます。ピボット テーブルの更新動作に似ていますが、相互運用性の依存関係はありません。 複雑なシナリオでは、 Excel グラフを作成したり、名前付き範囲を使用して数式をより適切に管理したりできます。 数式ベースのアプローチはどのようなパフォーマンス上の利点をもたらしますか? このコードをサンプル Excel ファイルに適用すると、次の出力が生成されます。 数式ベースのアプローチは、パフォーマンス上の大きな利点をもたらします。Excel の計算エンジンでネイティブに実行され、バックグラウンド計算がサポートされ、レポート用のExcel の印刷設定とシームレスに統合されます。 読みやすさを向上させるために、セルの書式設定やスタイル設定を適用することもできます。 ピボット テーブルの場合、C# Interop と IronXL を比較するとどうなりますか? それぞれのアプローチに適した展開シナリオはどれですか? アスペクト C#相互運用 IronXL 必要なオフィス はい - フルインストール スタンドアロンライブラリ プラットフォームサポート Windowsのみ Windows、Linux、macOS、Docker メモリ管理 手作業によるCOMのクリーンアップが必要 .NET 自動ガベージコレクション デプロイメント 複雑 - オフィスライセンス シンプル - 単一DLL パフォーマンス 遅い - Excelプロセス起動 高速 - インメモリ計算 クラウド対応 いいえ - Azureの制限 はい - Azure Functions のサポート ネイティブピボットテーブル はい いいえ - 集計の代替 開発スピード 遅い - COM の複雑さ 高速で直感的なAPI コンテナサポート いいえ - Dockerでは実行できません はい - Dockerの完全サポート ライセンス管理 Office マシンごとのライセンス シンプルなライセンスキー 各ソリューションのリソース要件は何ですか? C# Interop には、完全な Office インストール (2 ~ 4 GB のディスク領域)、Windows OS、Excel プロセス用の十分な RAM、COM 登録用の管理者権限など、かなりのシステム リソースが必要です。 対照的に、IronXL に必要なのは .NET ランタイムとライブラリ用の約 50 MB のみなので、リソースが制限された環境に最適です。 IronXL のファイル サイズ制限は、容量計画のために十分に文書化されています。 どのアプローチを選ぶべきか? Interop が意味を持つのはどのような場合ですか? C# Interopを選択する場合: ネイティブのExcelピボットテーブルオブジェクトが絶対必要です。 Office がインストールされた Windows のみで作業する 管理するデスクトップ システムにのみ展開する 既存のレガシーコードがInteropに依存している 従来の.NET Frameworkバージョンの使用 他の場所では利用できない特定の Excel 機能を必要とする これらの限定されたシナリオでは、適切なエラー処理と COM クリーンアップ パターンを確保します。 DevOpsチームが IronXL を好むのはなぜですか? IronXLをお選びください: サーバーまたはクラウド環境(Azure、AWS)へのデプロイ クロスプラットフォームアプリケーションの構築 パフォーマンスと信頼性の向上 Officeライセンスコストの回避 よりシンプルで保守性の高いコードが必要 Mac、iOS、Android、Linuxシステムをサポート 最新の .NET Core および .NET 5+ の使用 ピボットテーブルの構成をプログラムで完全に制御したい Blazorアプリケーションの構築 SQL データベースから Excel をロードするマイクロサービスの作成 IronXL は、ワークブックの暗号化やワークシートの保護など、広範なセキュリティ機能も提供します。 現代の開発にとって最善の進路は何でしょうか? C# Excel Interopはネイティブピボットテーブルを開発できますが、そのデプロイメント制限と複雑さは、現代のアプリケーションにはますます不向きになっています。 IronXL の機能セットは、データ集約と数式ベースの要約を通じて強力な代替手段を提供し、分析機能を維持しながら Office への依存を排除します。 Interop なしでピボット テーブル開発を検討している開発者にとって、IronXL は COM の複雑さを回避し、すべてのプラットフォームで動作し、展開を簡素化する優れたパスを提供します。 ネイティブピボットオブジェクトがないことのトレードオフは、より柔軟性が高く、パフォーマンスが向上し、Officeライセンス要件が排除されることで相殺されます。 スプレッドシートを作成したり、既存のファイルを読み込んだり、必要に応じてVB.NET を操作することもできます。 最新のDevOpsプラクティスでは、コンテナ対応のソリューションが求められます。 IronXL は、包括的なドキュメント、豊富な例、進化する展開ニーズに対応する定期的な更新によってこれを実現します。 今IronXLを始めましょう。 無料で始める Excel の自動化を最新化し、最新の C# で独自のピボット テーブル コードを作成する準備はできていますか? IronXLはNuGetパッケージ・マネージャーを通して、あなたのC#アプリケーションに数秒で実装することができます。 無料トライアルを試す、またはIronXLライセンスを購入することで、本番アプリケーションのInterop依存を排除することができます。 よくある質問 IronXL.Excelでピボット・テーブルを作成する利点は何ですか? IronXLは、Officeに依存することなくExcelでピボットテーブルを作成することができ、従来のC# Interop手法に比べてより合理的で効率的なソリューションです。 IronXLはピボットテーブルのデータ操作をどのように行うのですか? IronXLは強力なデータ操作機能を提供し、Excel Interopのような複雑な操作なしにピボット形式のレポートを作成することができます。 IronXLはExcel Interopと独立して使用できますか? IronXLは独立して動作するため、開発者はExcel Interopとそれに関連する依存関係に依存することなくピボット・テーブルを生成することができます。 なぜ開発者は従来のExcelのInterop手法よりもIronXLを好むのでしょうか? IronXLは、従来のInterop手法で必要だったOffice依存関係を排除することで、ピボットテーブルの作成プロセスを簡素化するため、開発者に好まれています。 IronXLを使用するにはMicrosoft Officeのインストールが必要ですか? IronXLはMicrosoft Officeのインストールを必要としません。Officeの依存関係を必要とするC# Interopとは異なり、Officeとは独立して動作するからです。 IronXLは最新のC#プログラミングと互換性がありますか? IronXLは最新のC#プログラミングとシームレスに統合するように設計されており、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形式にエクスポートします。 詳しく読む Blazor Export to Excel:C#でIronXLを使用した完全ガイドC#でStreamReaderを使用してExc...
公開日 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形式にエクスポートします。 詳しく読む