C# で Excel ピボット テーブルを作成する方法
C# で Excel ピボット テーブルを作成するには、Office Interop (Microsoft Office のインストールが必要) またはIronXLのような独立して動作する最新のライブラリを使用できます。IronXLは、DevOps 環境に対して優れた展開の柔軟性とクロス プラットフォーム サポートを提供します。
ピボットテーブルをプログラムで生成するには、Office の依存関係を持つ C# 相互運用性 を使用するか、 IronXLのような独立して動作する最新のライブラリを使用する必要があります。 このチュートリアルでは、両方のアプローチを実演し、特にDockerコンテナやAzure 、 AWSなどのクラウド環境にデプロイする場合に、開発者が従来の相互運用方法よりもIronXLを選択する理由を明らかにします。
この記事では、自動分析とエラー処理を備えたピボットテーブルとグループの編集、作成、設計、計算の方法を学びます。これらすべては、エンジニアが必要とするデプロイメントのシンプルさを維持しながら行われます。
Excelのピボットテーブルとは何ですか?
ピボットテーブルは、Excelの最も強力なツールの1つです。 これは大規模なデータセットを簡単に要約する方法であり、 .NETアプリケーションでのデータ分析において非常に貴重なものとなる。 ピボットテーブルを使用すると、数値データを簡単に表示、理解、分析できます。 これらはExcelだけでなく、Googleスプレッドシート、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)
この Interop の例では、Product を行に、Region を列に、Sales をデータ領域に合計した Excel ネイティブのピボット・テーブルを作成します。 機能的ではありますが、このアプローチではMicrosoft Officeのインストールと注意深いCOMオブジェクトの管理が必要です。 マイクロソフトのドキュメントには、この方法が現代的ではない理由が説明されています。 DevOps の観点からすると、このアプローチは効果的にコンテナ化できないため特に問題があります。Linux Docker コンテナに Microsoft Office をインストールしたり、サーバーレス環境にデプロイしたりすることはできません。
C#相互運用はどのような問題を引き起こしますか?
Interop アプローチには、現代の DevOps プラクティスやクラウドネイティブなデプロイメントには不向きな、いくつかの重大な課題があります。
残念ながら、Stack Overflowをはじめとするプログラミング関連のウェブサイトは、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.5GBから1GB未満に削減されたため、リソースが限られたコンテナ環境に最適です。
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
コンテナに適した方法でピボットテーブルを作成する方法は次のとおりです。 このアプローチは、外部依存関係なしに、Dockerコンテナ、Kubernetesポッド、およびサーバーレス関数でシームレスに機能します。 アプリケーション全体を軽量なコンテナイメージにパッケージ化することができ、 .NETがサポートされている環境であればどこでも実行可能です。
ピボットテーブルの出力はどのようなものですか?

この出力は、 IronXLがExcelのインストールを必要とせずに、生の販売データを構造化されたピボットレポートに変換する方法を示しており、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
これらの数式は、ソースデータへのライブ接続を維持し、データシートが変更されると自動的に更新されます - ピボットテーブルのリフレッシュ動作と似ていますが、Interopの依存関係はありません。 このアプローチは、外部依存関係なしに動的なレポートを生成する必要があるコンテナ化されたマイクロサービスに最適です。
動的サマリーからどのような結果が期待できますか?
このコードを前の例の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ピボットテーブルオブジェクトが絶対に必要
- Windows環境でのみ動作し、Officeがどこにでもインストールされている
- 管理しているデスクトップシステムにのみ展開します
- 既存のレガシーコードがInteropに依存している
- 旧バージョン for .NET Frameworkを使用する
- コンテナ化やクラウドへの移行の予定はありません
IronXLはどのような場合に優れた効果を発揮しますか?
IronXLを選択する場合:
- サーバーまたはクラウド環境(Azure、AWS)へのデプロイ コンテナ内で動作するクロスプラットフォームアプリケーションの構築
- 40倍の速度向上による、より優れたパフォーマンスが求められる
- Officeのライセンス費用と導入の複雑さを回避 *ライセンスキーの自動管理機能を備えた、よりシンプルなコードが必要
- Mac、iOS、Android、Linuxシステムに対応
- 最新 for .NET Coreおよび.NET 5-10での作業
- ピボットテーブルのフィールドをプログラムで構成する ・様々な形式にエクスポートするマイクロサービスの構築
- CI/CDパイプラインにおける自動レポートの実装
- コンテナオーケストレーション用のヘルスチェックエンドポイントを作成する *異なるスプレッドシート形式間の変換
C#でピボットテーブルを作成する際に、私たちは何を学んだのでしょうか?
C# Excel Interopはネイティブのピボットテーブルを作成できますが、その展開上の制約と複雑さから、特にコンテナ化された環境における最新のアプリケーションでは、ますます実用的ではなくなっています。 IronXLは、データ集計と数式に基づく要約を通じて強力な代替手段を提供し、分析機能を維持しながらOfficeへの依存を排除します。
Interopを使用せずにピボットテーブルを開発する代替手段を探している開発者やエンジニアにとって、 IronXLはCOMの複雑さを回避し、すべてのプラットフォームで動作し、展開を簡素化する優れた方法を提供します。 ネイティブピボットオブジェクトがないことのトレードオフは、より柔軟性が高く、パフォーマンスが向上し、Officeライセンス要件が排除されることで相殺されます。 DevOps チームにとって最も重要なのは、 IronXL がコンテナ化されたデプロイメント、自動スケーリング、最新の CI/CD パイプラインとのシームレスな統合により、真のインフラストラクチャ・アズ・コードを実現することです。
このライブラリの包括的な機能セットには、条件付き書式設定、セルスタイル設定、数式サポート、 データ検証などが含まれており、最新 for .NETアプリケーションにおけるExcel自動化のための完全なソリューションとなっています。 CSVファイルの操作、ワークシートの管理、複雑なデータ変換の実装など、どのような作業であっても、 IronXLは一貫性があり、導入しやすいAPIを提供します。
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特有のプログラミング言語を学ぶ必要がありません。



