IRONSOFTWAREHOME
IRONXLの使用

Office に依存せずに C# を使用して Excel でピボット テーブルを作成する方法

Curtis Chau
Curtis Chau
Updated: 2026年1月5日

C#でプログラム的にピボットテーブルを作成するには、従来は複雑なCOM管理を伴うOffice Interopが必要でしたが、 IronXLのような最新のライブラリを使用すると、Officeのインストールなしでクロスプラットフォームのピボットテーブルを生成でき、Dockerコンテナやクラウド展開をサポートしながらメモリリークも解消できます。

ピボットテーブルをプログラムで生成するには、Office の依存関係を持つ C# Interop を使用するか、 IronXLのような独立して動作する最新のライブラリを使用する必要があります。 このチュートリアルでは、両方のアプローチを紹介し、開発者が従来の方法よりもIronXLのコンテナ対応ソリューションを選択する理由を明らかにします。

この記事では、自動分析とエラー処理機能を備えたピボットテーブルの編集、作成、設計、計算方法について学びます。 AWSにデプロイする場合でも、 Azureで実行する場合でも、このガイドではExcel自動化の最新のアプローチについて解説します。

Excelのピボットテーブルとは何ですか?

データ分析において、ピボットテーブルが重要な理由とは?

ピボットテーブルは、大規模なデータセットを要約するためのExcelの最も強力なツールの1つです。 これは、数値データを簡単に表示、理解、分析できる方法を提供する。 ピボットテーブルは、Excelだけでなく、Googleスプレッドシート、Apple Numbers、CSVエクスポートでも利用できます。 彼らは、生データを意味のある洞察へと変換し、基となる情報にリンクするインタラクティブな要約を作成します。

C#でExcelの数式を扱う開発者にとって、ピボットテーブルは重要な集計機能を提供します。 単一のセルに対して演算を行う基本的な数学関数とは異なり、ピボットテーブルはデータセット全体にわたってExcel関数を集計することができます。

ピボットテーブルと通常のレポートは、それぞれどのような場合に使い分けるべきでしょうか?

ピボットテーブルを間違った方法で作成する方法を探り、その後、C# で正しい方法を学びましょう。

C# Interopを使用して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);

この Interop の例では、Product を行に、Region を列に、Sales をデータ領域に合計した Excel ネイティブのピボット・テーブルを作成します。 機能的ではありますが、このアプローチではMicrosoft Officeのインストールと注意深いCOMオブジェクトの管理が必要です。 マイクロソフト自身のドキュメントでも、現代の開発においてはこのような手法は推奨されていない。 コンテナ化された環境においては、 Interopを使用せずにExcelを操作することが不可欠です。

COMオブジェクトが適切に解放されなかった場合、どうなりますか?

C# Interopが引き起こす問題は何ですか?

コンテナ化された環境で相互運用が失敗する理由は?

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

この最新のアプローチでは、Dockerコンテナ内でシームレスに動作し、さまざまなExcel形式をサポートするピボットテーブルを作成します。 CSVJSON、XMLなど、さまざまな形式でエクスポートすることもできます。

出力はどのような形式になりますか?

左側に元の売上データを示し、右側に地域別に製品売上をサマリーしたピボットテーブルを示すExcelスプレッドシート

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

これらの数式はソースデータとのライブ接続を維持し、データシートが変更されると自動的に更新されます。これはピボットテーブルの更新動作に似ていますが、Interopへの依存関係はありません。 複雑なシナリオでは、 Excelグラフを作成したり名前付き範囲を使用したりすることで、数式の管理をより効率的に行うことができます。

数式に基づくアプローチは、どのようなパフォーマンス上の利点をもたらすのでしょうか?

このコードをサンプル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サポート
ライセンス管理オフィス向けマシン単位ライセンスシンプルなライセンスキー

各ソリューションに必要なリソースは何ですか?

C# Interopには、かなりのシステムリソースが必要です。具体的には、Officeのフルインストール(2~4GBのディスク容量)、Windows OS、Excel処理に必要な十分なRAM、およびCOM登録のための管理者権限が必要です。 それに対し、 IronXLは.NETランタイムとライブラリ用に約50MBしか必要としないため、リソースが限られた環境に最適です。 IronXLのファイルサイズ制限については、容量計画のために十分に文書化されています。

どのアプローチを選ぶべきか?

相互運用性はどのような場合に依然として有効なのか?

C# Interopを選択する場合:

  • ネイティブのExcelピボットテーブルオブジェクトが絶対必要です。
  • OfficeがインストールされたWindows環境でのみ動作します
  • 管理対象のデスクトップシステムにのみ展開する
  • 既存のレガシーコードがInteropに依存している
  • 旧バージョン for .NET Frameworkを使用する
  • 他の場所では利用できない特定のExcel機能が必要

これらの限定的なシナリオにおいては、適切なエラー処理とCOMクリーンアップパターンを確保してください。

なぜDevOpsチームはIronXLを好むのでしょうか?

IronXLをお選びください:

  • サーバーまたはクラウド環境(Azure、AWS)へのデプロイ
  • クロスプラットフォームアプリケーションの構築
  • パフォーマンスと信頼性の向上
  • Officeライセンスコストの回避
  • よりシンプルで保守性の高いコードが必要
  • Mac、iOS、Android、またはLinuxシステムに対応
  • 最新 for .NET Coreおよび.NET 5+での作業
  • ピボットテーブルの設定を完全にプログラムで制御したい Blazorアプリケーションの構築
  • SQLデータベースからExcelファイルを読み込むマイクロサービスを作成する

IronXLは、ワークブックの暗号化ワークシートの保護など、幅広いセキュリティ機能も提供しています。

現代の発展にとって最善の道筋とは何か?

C# Excel Interopはネイティブピボットテーブルを開発できますが、そのデプロイメント制限と複雑さは、現代のアプリケーションにはますます不向きになっています。 IronXLの機能セットは、データ集計と数式に基づく要約を通じて強力な代替手段を提供し、分析機能を維持しながらOfficeへの依存を排除​​します。

Interopを使用せずにピボットテーブル開発を行いたい開発者にとって、 IronXLはCOMの複雑さを回避し、あらゆるプラットフォームで動作し、導入を簡素化する優れたソリューションを提供します。 ネイティブピボットオブジェクトがないことのトレードオフは、より柔軟性が高く、パフォーマンスが向上し、Officeライセンス要件が排除されることで相殺されます。 スプレッドシートを作成したり既存のファイルを読み込んだり、必要に応じて.NETを操作したりすることもできます。

現代のDevOpsプラクティスは、コンテナフレンドリーなソリューションを要求しています。 IronXLは、包括的なドキュメント豊富なサンプル、そして進化する導入ニーズに対応した定期的なアップデートによって、これを実現します。

最初のステップ:
arrow pointer

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

IronXLはNuGetパッケージ・マネージャーを通して、あなたのC#アプリケーションに数秒で実装することができます。 無料トライアルを試す、またはIronXLライセンスを購入することで、本番アプリケーションのInterop依存を排除することができます。

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日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。