IRONSOFTWAREHOME
IRONXLの使用

C# で Excel ピボット テーブルを作成する方法

Curtis Chau
Curtis Chau
Updated: 2026年4月21日

C#でExcelピボットテーブルを作成するには、Office Interop(Microsoft Officeのインストールが必要)を使用するか、IronXLのような現代的なライブラリを使用します。IronXLは独立して動作し、優れたデプロイメントの柔軟性とDevOps環境向けのクロスプラットフォームサポートを提供します。

ピボットテーブルをプログラムで生成するには、Office の依存関係を持つ C# 相互運用性 を使用するか、 IronXLのような独立して動作する最新のライブラリを使用する必要があります。 このチュートリアルでは、両方のアプローチを実演し、特にDockerコンテナAzureAWSなどのクラウド環境にデプロイする場合に、開発者が従来の相互運用方法よりもIronXLを選択する理由を明らかにします。

この記事では、ピボットテーブルとグループを編集、作成、デザイン、計算する方法を学びます。すべての操作は、自動分析とエラー処理を伴い、DevOpsエンジニアが求めるシンプルなデプロイメントを維持します。

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);

この Interop の例では、Product を行に、Region を列に、Sales をデータ領域に合計した Excel ネイティブのピボット・テーブルを作成します。 機能的ではありますが、このアプローチではMicrosoft Officeのインストールと注意深いCOMオブジェクトの管理が必要です。 マイクロソフトのドキュメントには、この方法が現代的ではない理由が説明されています。 DevOps観点から見ると、このアプローチは特に問題があり、効果的にコンテナ化できません。Microsoft OfficeをLinux Dockerコンテナにインストールしたり、サーバーレス環境にデプロイすることはできません。

C# 相互運用性が引き起こす問題は何ですか?

Interopアプローチは、現代のDevOpsプラクティスやクラウドネイティブデプロイメントに不適切な、いくつかの重大な課題を提示します。

残念ながら、Stack Overflowをはじめとするプログラミング関連のウェブサイトは、2000年代初頭のスレッドに囚われているため、いまだにそれを推奨し続けている。

**展開時の依存関係:**本番サーバーを含む、ソースコードを実行するすべてのマシンにMicrosoft Officeがインストールされている必要があります。 これにより、ライセンスコストとデプロイメントの複雑さが加わります。

メモリ管理: COM オブジェクトは、Marshal.ReleaseComObject() を使用して明示的に解放する必要があります。 一つでもオブジェクトを見逃すと、Excelプロセスがメモリでハングしてしまうことが、Stack Overflowで広範に文書化されています。 ピボットキャッシュを考慮してください。

プラットフォームの制限:このソリューションは、OfficeがインストールされているWindowsでのみ動作します。 非常に動作が遅くなり、メモリリークを引き起こす可能性があります。 LinuxmacOS 、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");
    }
}

コンテナに適した方法でピボットテーブルを作成する方法は次のとおりです。 このアプローチは、外部依存関係なしに、Dockerコンテナ、Kubernetesポッド、およびサーバーレス関数でシームレスに機能します。 アプリケーション全体を軽量なコンテナイメージにパッケージ化することができ、 .NETがサポートされている環境であればどこでも実行可能です。

ピボットテーブルの出力はどのようなものですか?

元のExcel売上データと、地域ごとに集計された製品売上を示す生成されたピボットテーブルの比較

この出力は、 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

これらの数式は、ソースデータへのライブ接続を維持し、データシートが変更されると自動的に更新されます - ピボットテーブルのリフレッシュ動作と似ていますが、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イメージを作成し、迅速なデプロイと効率的なスケーリングを実現できます。 ヘルスチェックは標準 for .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を使用せずにピボットテーブルを開発する代替策を求める開発者およびDevOpsエンジニアのために、IronXLは優れた選択肢を提供し、COMの複雑さを避け、すべてのプラットフォームで動作し、デプロイメントを簡素化します。 ネイティブピボットオブジェクトがないことのトレードオフは、より柔軟性が高く、パフォーマンスが向上し、Officeライセンス要件が排除されることで相殺されます。 DevOpsチームにとって最も重要なのは、IronXLがコンテナ化されたデプロイメント、自動スケーリング、現代のCI/CDパイプラインとのシームレスな統合を実現する、真のインフラストラクチャをコードとして提供することです。

このライブラリの包括的な機能セットには、条件付き書式設定セルスタイル設定数式サポートデータ検証などが含まれており、最新 for .NETアプリケーションにおけるExcel自動化のための完全なソリューションとなっています。 CSVファイルの操作ワークシートの管理複雑なデータ変換の実装など、どのような作業であっても、 IronXLは一貫性があり、導入しやすいAPIを提供します。

最初のステップ:
arrow pointer

Excelの自動化を最新化し、最新のC#でピボットテーブルコードを作成する準備はできていますか?

IronXLはNuGetパッケージ・マネージャーを通して、あなたのC#アプリケーションに数秒で実装することができます。 無料トライアルをお試しいただくと、本番環境アプリケーションにおける相互運用性の依存関係を解消し、コンテナデプロイメントを簡素化できます。

Curtis Chau
テクニカルライター

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

...
詳しく読む

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。