푸터 콘텐츠로 바로가기
IRONXL 사용하여

C#에서 Excel 피벗 테이블을 만드는 방법

프로그램적으로 Excel 피벗 테이블을 다루는 것은 소스 데이터를 분석하고 계산해야 하는 비즈니스 애플리케이션에서 일반적으로 요구됩니다. Microsoft의 Excel Interop은 Excel 파일에서 피벗 테이블을 만드는 전통적인 방법이었지만, 현대적인 솔루션인 IronXL은 상당한 이점을 제공합니다. 이 가이드는 실용적인 예제를 통해 C# Interop을 사용하여 Excel에서 피벗 테이블을 생성하거나 더 나은 대안을 선택하는 두 가지 방법을 자세히 설명합니다.

두 가지 접근 방식 이해하기

Excel Interop이란 무엇입니까?

Excel Interop은 C#을 통해 COM(컴포넌트 오브젝트 모델)을 사용하여 Microsoft Excel을 직접 제어합니다. 시스템에 Office가 설치되어야 하며, 사용자와 애플리케이션이 상호 작용하듯이 Excel을 자동화합니다. 각 워크시트, 워크북 및 셀은 코드로 조작할 수 있는 객체가 됩니다.

IronXL이란 무엇입니까?

IronXL은 Microsoft Office를 요구하지 않고 Excel 파일을 읽고, 편집하고, 만들 수 있는 독립 실행형 .NET 라이브러리입니다. Windows, Linux, macOS 및 Docker 컨테이너에서 작동하여 현대적인 배포 시나리오에 적합합니다. COM 상호 운용의 부담 없이 데이터를 열고, 저장하고, 내보낼 수 있습니다.

환경 설정하기

Excel Interop을 위한

Install-Package Microsoft.Office.Interop.Excel

IronXL을 위한

Install-Package IronXl.Excel

또한, NuGet 패키지 관리자 UI를 사용하여 "IronXl.Excel"을 검색하고 설치를 클릭할 수 있습니다. .NET CLI로 명령 인수를 사용하여 설치하거나 GitHub에서 직접 참조할 수도 있습니다.

두 라이브러리는 NuGet에서 사용할 수 있습니다. Excel Interop은 전체 Microsoft Office 설치가 필요하고 IronXL은 독립적으로 작동합니다. 계속하기 전에 시스템이 요구 사항을 충족하는지 확인하세요.

Creating an Excel Pivot Table Programmatically with C# Interop

다음은 전통적인 Interop 접근 방식을 사용하여 프로그램적으로 피벗 테이블을 생성하는 방법을 보여주는 완전한 예제입니다:

using Excel = Microsoft.Office.Interop.Excel;
class Program
{
    static void Main(string[] args)
    {
        // Create Excel application instance
        var excelApp = new Excel.Application();
        var workbook = excelApp.Workbooks.Add();
                    var dataSheet = (Excel.Worksheet)workbook.Worksheets[1];
            var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add();
            // Add header row and sample data
            dataSheet.Cells[1, 1] = "Product";
            dataSheet.Cells[1, 2] = "Region";
            dataSheet.Cells[1, 3] = "Sales";
            // ... populate data rows with values
            // Add sample data rows
            dataSheet.Cells[2, 1] = "Laptop";
            dataSheet.Cells[2, 2] = "North";
            dataSheet.Cells[2, 3] = 1200;
            dataSheet.Cells[3, 1] = "Laptop";
            dataSheet.Cells[3, 2] = "South";
            dataSheet.Cells[3, 3] = 1500;
            dataSheet.Cells[4, 1] = "Phone";
            dataSheet.Cells[4, 2] = "North";
            dataSheet.Cells[4, 3] = 800;
            dataSheet.Cells[5, 1] = "Phone";
            dataSheet.Cells[5, 2] = "South";
            dataSheet.Cells[5, 3] = 950;
            dataSheet.Cells[6, 1] = "Tablet";
            dataSheet.Cells[6, 2] = "East";
            dataSheet.Cells[6, 3] = 600;
            dataSheet.Cells[7, 1] = "Tablet";
            dataSheet.Cells[7, 2] = "West";
            dataSheet.Cells[7, 3] = 750;
            dataSheet.Cells[8, 1] = "Monitor";
            dataSheet.Cells[8, 2] = "North";
            dataSheet.Cells[8, 3] = 400;
            dataSheet.Cells[9, 1] = "Monitor";
            dataSheet.Cells[9, 2] = "South";
            dataSheet.Cells[9, 3] = 500;
            dataSheet.Cells[10, 1] = "Keyboard";
            dataSheet.Cells[10, 2] = "East";
            dataSheet.Cells[10, 3] = 300;
            // Create pivot cache from source data range
            Excel.Range dataRange = dataSheet.Range["A1:C10"];
            Excel.PivotCache pivotCache = workbook.PivotCaches().Create(
                Excel.XlPivotTableSourceType.xlDatabase, dataRange);
            // Create PivotTable at specific location
            Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables();
            Excel.PivotTable pivotTable = pivotTables.Add(
                pivotCache, pivotSheet.Range["A3"], "SalesPivot");
            // Configure pivot table fields - row and column headers
            ((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation =
                Excel.XlPivotFieldOrientation.xlRowField;
            ((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation =
                Excel.XlPivotFieldOrientation.xlColumnField;
            ((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation =
                Excel.XlPivotFieldOrientation.xlDataField;
            // Configure grand totals and formatting
            pivotTable.RowGrand = true;
            pivotTable.ColumnGrand = true;
            // Save the Excel file
            workbook.SaveAs("pivot_interop.xlsx");
            workbook.Close();
            excelApp.Quit();
            // Critical: Release COM objects to avoid errors
            #if WINDOWS
            Marshal.ReleaseComObject(pivotTable);
            Marshal.ReleaseComObject(pivotSheet);
            Marshal.ReleaseComObject(dataSheet);
            Marshal.ReleaseComObject(workbook);
            Marshal.ReleaseComObject(excelApp);
            #endif
    }
}
using Excel = Microsoft.Office.Interop.Excel;
class Program
{
    static void Main(string[] args)
    {
        // Create Excel application instance
        var excelApp = new Excel.Application();
        var workbook = excelApp.Workbooks.Add();
                    var dataSheet = (Excel.Worksheet)workbook.Worksheets[1];
            var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add();
            // Add header row and sample data
            dataSheet.Cells[1, 1] = "Product";
            dataSheet.Cells[1, 2] = "Region";
            dataSheet.Cells[1, 3] = "Sales";
            // ... populate data rows with values
            // Add sample data rows
            dataSheet.Cells[2, 1] = "Laptop";
            dataSheet.Cells[2, 2] = "North";
            dataSheet.Cells[2, 3] = 1200;
            dataSheet.Cells[3, 1] = "Laptop";
            dataSheet.Cells[3, 2] = "South";
            dataSheet.Cells[3, 3] = 1500;
            dataSheet.Cells[4, 1] = "Phone";
            dataSheet.Cells[4, 2] = "North";
            dataSheet.Cells[4, 3] = 800;
            dataSheet.Cells[5, 1] = "Phone";
            dataSheet.Cells[5, 2] = "South";
            dataSheet.Cells[5, 3] = 950;
            dataSheet.Cells[6, 1] = "Tablet";
            dataSheet.Cells[6, 2] = "East";
            dataSheet.Cells[6, 3] = 600;
            dataSheet.Cells[7, 1] = "Tablet";
            dataSheet.Cells[7, 2] = "West";
            dataSheet.Cells[7, 3] = 750;
            dataSheet.Cells[8, 1] = "Monitor";
            dataSheet.Cells[8, 2] = "North";
            dataSheet.Cells[8, 3] = 400;
            dataSheet.Cells[9, 1] = "Monitor";
            dataSheet.Cells[9, 2] = "South";
            dataSheet.Cells[9, 3] = 500;
            dataSheet.Cells[10, 1] = "Keyboard";
            dataSheet.Cells[10, 2] = "East";
            dataSheet.Cells[10, 3] = 300;
            // Create pivot cache from source data range
            Excel.Range dataRange = dataSheet.Range["A1:C10"];
            Excel.PivotCache pivotCache = workbook.PivotCaches().Create(
                Excel.XlPivotTableSourceType.xlDatabase, dataRange);
            // Create PivotTable at specific location
            Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables();
            Excel.PivotTable pivotTable = pivotTables.Add(
                pivotCache, pivotSheet.Range["A3"], "SalesPivot");
            // Configure pivot table fields - row and column headers
            ((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation =
                Excel.XlPivotFieldOrientation.xlRowField;
            ((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation =
                Excel.XlPivotFieldOrientation.xlColumnField;
            ((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation =
                Excel.XlPivotFieldOrientation.xlDataField;
            // Configure grand totals and formatting
            pivotTable.RowGrand = true;
            pivotTable.ColumnGrand = true;
            // Save the Excel file
            workbook.SaveAs("pivot_interop.xlsx");
            workbook.Close();
            excelApp.Quit();
            // Critical: Release COM objects to avoid errors
            #if WINDOWS
            Marshal.ReleaseComObject(pivotTable);
            Marshal.ReleaseComObject(pivotSheet);
            Marshal.ReleaseComObject(dataSheet);
            Marshal.ReleaseComObject(workbook);
            Marshal.ReleaseComObject(excelApp);
            #endif
    }
}
$vbLabelText   $csharpLabel

이 코드는 Excel 애플리케이션을 생성하고, 헤더 행을 포함한 소스 데이터로 워크시트를 추가하며, 피벗 캐시를 설정하고, PivotTable 객체를 구축하며, 필드 방향을 구성합니다. 정리 섹션은 매우 중요합니다 - COM 객체를 해제하지 않으면 메모리 누수가 발생합니다. 각 셀, 범위 및 워크시트는 런타임 오류를 피하기 위해 적절히 처분해야 합니다.

IronXL 대안 접근 방식

IronXL은 Excel 파일 형식을 직접 처리하여 다른 접근 방식을 취합니다. 유사한 분석 결과를 프로그램적으로 달성하는 방법은 다음과 같습니다:

using IronXL;
using System.Linq;
class Program 
{
    static void Main(string[] args)
    {
        // Create workbook and add worksheet with data
        WorkBook workbook = WorkBook.Create();
        WorkSheet sheet = workbook.CreateWorkSheet("Data");
        // Add header row to define column structure
        sheet["A1"].Value = "Product";
        sheet["B1"].Value = "Region";
        sheet["C1"].Value = "Sales";
        // Add sample data to cells
        sheet["A2"].Value = "Widget";
        sheet["B2"].Value = "North";
        sheet["C2"].Value = 1500;
        // ... continue to add more data rows
        sheet["A3"].Value = "Laptop";
        sheet["B3"].Value = "South";
        sheet["C3"].Value = 1500;
        sheet["A4"].Value = "Phone";
        sheet["B4"].Value = "North";
        sheet["C4"].Value = 800;
        sheet["A5"].Value = "Phone";
        sheet["B5"].Value = "South";
        sheet["C5"].Value = 950;
        sheet["A6"].Value = "Tablet";
        sheet["B6"].Value = "East";
        sheet["C6"].Value = 600;
        sheet["A7"].Value = "Tablet";
        sheet["B7"].Value = "West";
        sheet["C7"].Value = 750;
        sheet["A8"].Value = "Monitor";
        sheet["B8"].Value = "North";
        sheet["C8"].Value = 400;
        sheet["A9"].Value = "Monitor";
        sheet["B9"].Value = "South";
        sheet["C9"].Value = 500;
        sheet["A10"].Value = "Keyboard";
        sheet["B10"].Value = "East";
        sheet["C10"].Value = 300;
        // Create summary analysis worksheet
        var summarySheet = workbook.CreateWorkSheet("Summary");
        // Group and calculate aggregated data
        var data = sheet["A1:C10"].ToDataTable(true);
        var productSummary = data.AsEnumerable()
            .GroupBy(row => row.Field<string>("Product"))
            .Select((group, index) => new {
                Product = group.Key,
                TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])),
                Count = group.Count(),
                RowIndex = index + 2
            });
        // Write column headers for summary
        summarySheet["A1"].Value = "Product Summary";
        summarySheet["A2"].Value = "Product";
        summarySheet["B2"].Value = "Total Sales";
        summarySheet["C2"].Value = "Count";
        // Export results to cells
        foreach (var item in productSummary)
        {
            summarySheet[$"A{item.RowIndex + 1}"].Value = item.Product;
            summarySheet[$"B{item.RowIndex + 1}"].Value = item.TotalSales;
            summarySheet[$"C{item.RowIndex + 1}"].Value = item.Count;
        }
        // Apply number formatting and style
        summarySheet["B:B"].FormatString = "$#,##0.00";
        // Save the xlsx file
        workbook.SaveAs("analysis_ironxl.xlsx");
    }
}
using IronXL;
using System.Linq;
class Program 
{
    static void Main(string[] args)
    {
        // Create workbook and add worksheet with data
        WorkBook workbook = WorkBook.Create();
        WorkSheet sheet = workbook.CreateWorkSheet("Data");
        // Add header row to define column structure
        sheet["A1"].Value = "Product";
        sheet["B1"].Value = "Region";
        sheet["C1"].Value = "Sales";
        // Add sample data to cells
        sheet["A2"].Value = "Widget";
        sheet["B2"].Value = "North";
        sheet["C2"].Value = 1500;
        // ... continue to add more data rows
        sheet["A3"].Value = "Laptop";
        sheet["B3"].Value = "South";
        sheet["C3"].Value = 1500;
        sheet["A4"].Value = "Phone";
        sheet["B4"].Value = "North";
        sheet["C4"].Value = 800;
        sheet["A5"].Value = "Phone";
        sheet["B5"].Value = "South";
        sheet["C5"].Value = 950;
        sheet["A6"].Value = "Tablet";
        sheet["B6"].Value = "East";
        sheet["C6"].Value = 600;
        sheet["A7"].Value = "Tablet";
        sheet["B7"].Value = "West";
        sheet["C7"].Value = 750;
        sheet["A8"].Value = "Monitor";
        sheet["B8"].Value = "North";
        sheet["C8"].Value = 400;
        sheet["A9"].Value = "Monitor";
        sheet["B9"].Value = "South";
        sheet["C9"].Value = 500;
        sheet["A10"].Value = "Keyboard";
        sheet["B10"].Value = "East";
        sheet["C10"].Value = 300;
        // Create summary analysis worksheet
        var summarySheet = workbook.CreateWorkSheet("Summary");
        // Group and calculate aggregated data
        var data = sheet["A1:C10"].ToDataTable(true);
        var productSummary = data.AsEnumerable()
            .GroupBy(row => row.Field<string>("Product"))
            .Select((group, index) => new {
                Product = group.Key,
                TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])),
                Count = group.Count(),
                RowIndex = index + 2
            });
        // Write column headers for summary
        summarySheet["A1"].Value = "Product Summary";
        summarySheet["A2"].Value = "Product";
        summarySheet["B2"].Value = "Total Sales";
        summarySheet["C2"].Value = "Count";
        // Export results to cells
        foreach (var item in productSummary)
        {
            summarySheet[$"A{item.RowIndex + 1}"].Value = item.Product;
            summarySheet[$"B{item.RowIndex + 1}"].Value = item.TotalSales;
            summarySheet[$"C{item.RowIndex + 1}"].Value = item.Count;
        }
        // Apply number formatting and style
        summarySheet["B:B"].FormatString = "$#,##0.00";
        // Save the xlsx file
        workbook.SaveAs("analysis_ironxl.xlsx");
    }
}
$vbLabelText   $csharpLabel

이 IronXL 예제는 워크북을 생성하고, 워크시트를 추가하고, 데이터를 사용하여 셀을 채우며 집계 분석을 수행하는 방법을 보여줍니다. 코드는 제품별로 데이터를 그룹화하고, 합계와 카운트를 계산하여 요약 보고서를 작성합니다. COM 개체에 대한 관리가 필요하지 않으며, 메서드는 자동으로 메모리를 처리하는 간단한 .NET 컬렉션입니다.

산출

C#에서 Excel 피벗 테이블 생성 방법: 그림 6 - IronXL 출력

C#에서 Excel 피벗 테이블 생성 방법: 그림 7 - 요약 출력

주요 차이점 및 고려 사항

배포 요구사항

Excel Interop의 요구사항:

  • 유효한 라이선스가 있는 Microsoft Excel 설치
  • Windows 운영 체제
  • 적절한 COM 권한 및 설정
  • Office 자동화를 위한 서버 구성 IronXL의 요구사항:

  • IronXL 라이브러리 패키지만 필요
  • .NET을 지원하는 모든 플랫폼에서 작동
  • Office 설치나 라이선스 불필요
  • 간소화된 배포 과정

C#에서 Excel 피벗 테이블 생성 방법: 그림 8 - 기능

코드 품질 및 유지 보수

Interop에서는 메모리 누수 및 오류를 피하기 위해 COM 개체를 주의 깊게 관리해야 합니다. 생성된 모든 Excel 개체는 올바른 메서드를 사용하여 명시적으로 해제해야 합니다. IronXL은 자동 쓰레기 수집이 포함된 표준 .NET 개체를 사용하여 자원 문제의 위험을 줄입니다.

오류 처리

Interop과 관련된 오류는 종종 Excel 가용성, 버전 차이 또는 COM 실패와 관련이 있습니다. IronXL 오류는 표준 .NET 예외로, 디버그가 더 간단합니다. COM 관련 문제에 대해 걱정하지 않고 익숙한 try-catch 패턴에 의존할 수 있습니다.

모범 사례 및 권장 사항

Excel Interop을 선택하세요:

  • 모든 서식 옵션이 포함된 정확한 Excel 피벗 테이블 기능이 필요할 때
  • 시스템에서 Excel의 가용성이 보장될 때
  • Windows 데스크탑 애플리케이션에서만 작업할 때
  • 레거시 코드 요구사항이 있을 때 IronXL을 선택하세요:

  • 서버 애플리케이션이나 웹 솔루션을 빌드할 때
  • 플랫폼 간 호환성이 필요할 때
  • COM 오버헤드 없이 안정적인 성능이 필요할 때
  • 컨테이너나 클라우드 환경에 배포할 때

IronXL 문서를 방문하여 구현에 대한 자세한 내용을 알아보세요. 질문이나 지원이 필요하면 Iron Software 팀에 문의하세요.

결론

C# Interop은 Excel의 피벗 테이블 기능에 직접 접근할 수 있는 반면, 배포 제한과 복잡성을 수반합니다. IronXL은 .NET이 지원되는 어디서나 실행할 수 있는 유연성을 제공하면서 Excel 파일 조작을 단순화하는 현대적인 대안을 제공합니다.

새로운 애플리케이션을 개발하거나 기존 솔루션을 현대화하는 개발자에게 IronXL의 접근 방식은 COM InterOp 오버헤드를 제거하면서 강력한 데이터 조작 기능을 제공합니다. Excel 데이터를 읽고, 편집하고, 내보내야 할 때 IronXL은 더 깔끔한 솔루션을 제공합니다.

IronXL의 무료 체험판으로 차이를 경험하거나 튜토리얼을 탐색하여 더 많은 예제를 확인해보세요. 배포할 준비가 되셨나요? 라이선스 옵션 보기를 통해 작업에 맞는 패키지를 선택하세요.

C#에서 Excel 피벗 테이블 생성 방법: 그림 9 - 라이선싱

자주 묻는 질문

피벗 테이블을 만들 때 Excel Interop 대신 IronXL 사용하는 장점은 무엇입니까?

IronXL 사용 편의성, 향상된 성능, 서버에 Excel이 설치되어 있지 않아도 피벗 테이블을 생성할 수 있는 기능 등 Excel Interop에 비해 여러 가지 중요한 이점을 제공합니다.

Excel Interop을 사용하지 않고 C#에서 Excel 피벗 테이블을 만들 수 있나요?

네, IronXL 사용하면 C#에서 Excel 피벗 테이블을 만들 수 있습니다. IronXL은 Excel Interop의 현대적이고 효율적인 대안을 제공합니다.

IronXL 사용하려면 Microsoft Excel이 설치되어 있어야 하나요?

아니요, IronXL 시스템에 Microsoft Excel이 설치되어 있을 필요가 없으므로 Excel 파일을 생성하고 관리하는 데 유연한 솔루션입니다.

IronXL 사용하여 Excel에서 피벗 테이블을 만드는 단계는 무엇입니까?

IronXL 사용하여 피벗 테이블을 만들려면 먼저 Excel 파일을 불러오고, 데이터 범위를 지정하고, 피벗 테이블 필드를 정의한 다음 피벗 테이블을 생성하면 됩니다. IronXL의 포괄적인 API 덕분에 이 과정이 매우 간편합니다.

IronXL 피벗 테이블 외에 다른 Excel 기능도 지원합니까?

네, IronXL Excel 파일 읽기 및 쓰기, 셀 서식 지정, 계산 수행 등 다양한 Excel 기능을 지원합니다.

IronXL 피벗 테이블을 생성할 때 대규모 데이터 세트를 어떻게 처리합니까?

IronXL 대규모 데이터 세트를 효율적으로 처리하도록 설계되어 방대한 데이터가 있더라도 피벗 테이블을 빠르고 안정적으로 생성할 수 있습니다.

IronXL 클라우드 기반 애플리케이션에서 사용할 수 있습니까?

네, IronXL 클라우드 기반 애플리케이션에 통합되어 클라우드에서 Excel 파일을 관리하는 원활한 솔루션을 제공합니다.

IronXL 은 피벗 테이블 생성을 위해 어떤 프로그래밍 언어를 지원합니까?

IronXL 주로 C#을 지원하므로 .NET 애플리케이션 내에서 피벗 테이블을 만들고 기타 Excel 작업을 쉽게 수행할 수 있습니다.

IronXL 사용법을 배울 수 있는 튜토리얼이 있나요?

네, Iron Software 사용자가 IronXL 효과적으로 사용하는 방법을 배울 수 있도록 웹사이트에 포괄적인 문서와 튜토리얼을 제공합니다.

IronXL 에 사용할 수 있는 라이선스 옵션은 무엇입니까?

IronXL 다양한 프로젝트 요구 사항과 규모에 맞춰 무료 및 유료 등급을 포함한 다양한 라이선스 옵션을 제공합니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me