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

IronXL 사용하여 C#으로 Excel에서 피벗 테이블을 만드는 방법

프로그래밍 방식으로 Excel에서 피벗 테이블을 생성하려면 Office 종속성과 함께 C# Interop을 사용하거나, 독립적으로 작동하는 IronXL과 같은 현대적인 라이브러리를 사용해야 합니다. 이 튜토리얼은 두 가지 접근 방식을 모두 보여주며 왜 현대적인 방법이 더 나은지 정확히 보여줍니다.

서버 사이드 또는 크로스 플랫폼 .NET 코드에서 피벗 스타일 보고서를 작성하는 것은 역사적으로 고통스러웠습니다. 전통적인 COM Interop 경로는 모든 Office 설치가 완료된 Windows 머신에 당신을 묶고, COM 정리 호출을 하나라도 놓치면 메모리 누수가 발생하며, Linux나 Docker 컨테이너에 배포하려는 순간 실패합니다. 현대적 대안은 IronXL 및 LINQ로 집계 로직을 작성하는 것으로, .NET이 실행되는 어디서나 실행되며 Office 라이센스가 필요없고, 깨끗하고 읽기 쉬운 코드를 제공합니다.

이 가이드는 두 기술 모두를 자세히 다룹니다. 당신은 원시 Interop 접근 방식을 보고, 왜 이것이 불안정한지 정확히 이해하며, C#의 IronXL을 사용하여 동일한 피벗 스타일 요약 시트를 구축하게 됩니다. 실제 피벗 테이블 새로 고침처럼 작동하는 라이브 자동 업데이트 요약을 위한 Excel 수식 사용 방법도 보게 됩니다.

Excel 피벗 테이블이란 무엇입니까?

피벗 테이블은 스프레드시트 소프트웨어에서 가장 강력한 분석 도구 중 하나입니다. 행을 그룹화하고 값을 집계하여 결과를 교차 분석 형식으로 투영함으로써 대량의 데이터 세트를 요약합니다 - 이 모든 것이 수동으로 단일 공식도 작성하지 않고 가능합니다. Microsoft의 공식 피벗 테이블 문서는 Excel 내에서 이 기능이 수행하는 작업에 대한 철저한 개요를 제공합니다.

피벗 테이블은 Microsoft Excel, Google Sheets, Apple Numbers 및 대부분의 다른 스프레드시트 도구에서 사용할 수 있습니다. 핵심 개념은 항상 동일합니다: 행 필드, 열 필드 및 값 필드를 정의하면 도구가 요약 매트릭스를 작성합니다. 기본 데이터가 변경되면 피벗 테이블을 새로 고치고 요약이 자동으로 업데이트됩니다.

C# 서버 측 코드에서는 두 가지 광범위한 옵션을 사용할 수 있습니다:

  • C# Interop -- XLSX 파일 내에 실제 네이티브 피벗 테이블 객체를 만드는 COM을 통해 실행 중인 Excel 프로세스를 자동화합니다.
  • IronXL with LINQ 집계 -- 워크북을 메모리로 읽어들인 후 관리되는 .NET 코드에서 동일한 요약을 계산하고 결과를 새로운 워크시트에 씁니다.

두 가지 옵션 모두 유용한 출력을 생성합니다. 그러나 현대의 배포 환경에서 신뢰할 수 있는 것은 하나뿐입니다.

C# Interop을 사용하여 피벗 테이블을 만드는 방법은?

C# Excel Interop을 통해 COM 자동화를 통해 Excel의 네이티브 피벗 테이블 기능에 직접 액세스할 수 있습니다. 객체를 생성하고, 워크북을 열고, 데이터 범위를 가리키는 피벗 캐시를 정의한 다음, 행 필드, 열 필드 및 데이터 필드를 구성합니다.

Interop 피벗 테이블 코드 설정 방법

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;

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

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

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

// 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);
$vbLabelText   $csharpLabel

이 Interop 예제는 데이터 영역에서 판매가 요약되고 제품이 행, 지역이 열로 있는 네이티브 Excel 피벗 테이블을 만듭니다. XLSX 파일 내에 실제 피벗 테이블 객체를 생성하지만 Microsoft Office가 설치되어 있어야 하며 세심한 COM 객체 관리를 요구합니다. 단일 호출을 놓치면 작업 관리자에서 오래된 Excel 프로세스가 축적되는 것을 발견하게 됩니다.

코드를 작성하기 전에 IronXL 설치 방법

IronXL 접근 방식으로 뛰어들기 전에 NuGet 패키지 관리자를 통해 라이브러리를 설치하십시오:

Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

서버, 컨테이너 또는 개발 머신에 Office 설치가 필요하지 않습니다. IronXL은 관리 .NET 메모리에서만 전체적으로 XLSX, XLS 및 CSV 파일을 읽고 씁니다.

C# Interop이 일으키는 문제는 무엇입니까?

Interop 접근 방식은 실제 배포에서 빠르게 겹치는 여러 가지 중요한 어려움을 나타냅니다. Stack Overflow 및 다른 프로그래밍 리소스는 여전히 이를 추천하고 있는데, 많은 게시물이 2000년대 초반에 작성되었고 이후로 잠겨서 조언이 시간에 얼어있기 때문입니다.

배포 종속성 -- 코드를 실행하는 모든 머신에 라이센스가 있는 Microsoft Office 복사본이 설치되어 있어야 하며, 여기에는 프로덕션 서버 및 CI/CD 빌드 에이전트도 포함됩니다. 이는 라이센스 비용과 배포 복잡성을 추가하며, 이는 현대적인 대안으로 완전히 피할 수 있습니다.

메모리 관리 부담 -- COM 개체는 명시적으로 사용하여 해제해야 합니다. 객체 하나라도 누락되면 Excel 프로세스가 메모리에서 무기한 정지 상태가 되며, Stack Overflow에서 광범위하게 문서화된 것처럼 됩니다. 장기 실행 서비스나 ASP.NET 웹 응용 프로그램에서는 이 문제가 중요한 리소스 누출이 됩니다.

플랫폼 제한 -- Interop은 Office가 설치된 Windows에서만 작동합니다. 이를 Linux, macOS, Docker 컨테이너 또는 Azure Functions나 AWS Lambda와 같은 서버리스 플랫폼에서 실행할 수 없습니다. 이로 인해 현대의 클라우드 네이티브 아키텍처를 완전히 차단합니다.

성능 병목 -- Excel 응용 프로그램 인스턴스를 시작하는 것은 느리고 리소스를 많이 소모합니다. 서버 측 배치 처리에서 수십 또는 수백 개의 보고서를 생성해야 할 경우 이 시작 오버헤드는 심각한 처리량 제약이 됩니다.

버전 호환성 취약성 -- 다른 Office 버전은 약간 다른 COM 인터페이스를 노출합니다. Office 2019에서 작동하는 코드가 Office 2016 또는 Microsoft 365에서 다르게 작동할 수 있으며, 배포 시 버전을 고정할 방법이 없습니다. Office Interop 어셈블리에 대한 Microsoft 문서는 이러한 버전 제약을 알려진 제한으로 언급합니다.

CI/CD 비호환성 -- 대부분의 지속적인 통합 환경에는 Office가 설치되어 있지 않습니다. 피벗 테이블 생성 코드를 테스트하기 위해서는 전체 COM 레이어를 모의하거나 라이센스가 있는 Office 설치 구현된 특별한 Windows 에이전트를 유지해야 합니다.

새로운 .NET 6 이후, .NET 10을 포함한 모든 .NET 애플리케이션 타깃은 이러한 제약으로 인해 Interop은 현실적으로 불가능합니다.

IronXL은 Interop 없이 어떻게 피벗 테이블을 생성합니까?

IronXL은 피벗 테이블 생성 접근 방식이 다릅니다. COM을 통해 외부 Excel 프로세스를 제어하는 대신, IronXL은 관리 .NET 메모리로 워크북을 읽어들여 셀 값, 공식 및 워크시트 구조에 직접 접근할 수 있게 합니다. 그런 다음 표준 LINQ 쿼리를 사용하여 피벗 스타일 집계를 작성하고 결과를 새로운 워크시트에 다시 씁니다.

IronXL 및 LINQ를 사용하여 교차 분석 요약을 작성하는 방법

다음 예는 판매 데이터 워크북을 로드하고, 제품별 지역별 교차 분석을 계산하여 요약을 새로운 워크시트에 씁니다 - 모든 Office 종속성 없이:

using IronXL;
using System.Linq;
using System.Data;

// Load Excel file -- no Office installation required
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet dataSheet = workbook.WorkSheets[0];

// Convert to DataTable for flexible LINQ manipulation
var dataTable = dataSheet.ToDataTable(true); // true = first row as column headers

// Build pivot-style aggregation using LINQ grouping
var pivotData = dataTable.AsEnumerable()
    .GroupBy(row => new {
        Product = row["Product"].ToString(),
        Region = row["Region"].ToString()
    })
    .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 the pivot report worksheet
WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport");

// Get distinct row and column values
var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p).ToList();
var regions  = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r).ToList();

// Write column headers
pivotSheet["A1"].Value = "Product / Region";
for (int c = 0; c < regions.Count; c++)
{
    pivotSheet[$"{(char)('B' + c)}1"].Value = regions[c];
}

// Populate data rows
for (int r = 0; r < products.Count; r++)
{
    pivotSheet[$"A{r + 2}"].Value = products[r];
    for (int c = 0; c < regions.Count; c++)
    {
        var sales = pivotData
            .Where(p => p.Product == products[r] && p.Region == regions[c])
            .Select(p => p.TotalSales)
            .FirstOrDefault();
        pivotSheet[$"{(char)('B' + c)}{r + 2}"].Value = sales;
    }
}

// Add a totals row using Excel SUM formulas
int totalRow = products.Count + 2;
pivotSheet[$"A{totalRow}"].Value = "Total";
for (int c = 0; c < regions.Count; c++)
{
    char col = (char)('B' + c);
    pivotSheet[$"{col}{totalRow}"].Formula = $"=SUM({col}2:{col}{totalRow - 1})";
}

// Apply currency formatting to the data range
var dataRange = pivotSheet[$"B2:{(char)('B' + regions.Count - 1)}{totalRow}"];
dataRange.FormatString = "$#,##0.00";

workbook.SaveAs("PivotReport.xlsx");
using IronXL;
using System.Linq;
using System.Data;

// Load Excel file -- no Office installation required
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet dataSheet = workbook.WorkSheets[0];

// Convert to DataTable for flexible LINQ manipulation
var dataTable = dataSheet.ToDataTable(true); // true = first row as column headers

// Build pivot-style aggregation using LINQ grouping
var pivotData = dataTable.AsEnumerable()
    .GroupBy(row => new {
        Product = row["Product"].ToString(),
        Region = row["Region"].ToString()
    })
    .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 the pivot report worksheet
WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport");

// Get distinct row and column values
var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p).ToList();
var regions  = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r).ToList();

// Write column headers
pivotSheet["A1"].Value = "Product / Region";
for (int c = 0; c < regions.Count; c++)
{
    pivotSheet[$"{(char)('B' + c)}1"].Value = regions[c];
}

// Populate data rows
for (int r = 0; r < products.Count; r++)
{
    pivotSheet[$"A{r + 2}"].Value = products[r];
    for (int c = 0; c < regions.Count; c++)
    {
        var sales = pivotData
            .Where(p => p.Product == products[r] && p.Region == regions[c])
            .Select(p => p.TotalSales)
            .FirstOrDefault();
        pivotSheet[$"{(char)('B' + c)}{r + 2}"].Value = sales;
    }
}

// Add a totals row using Excel SUM formulas
int totalRow = products.Count + 2;
pivotSheet[$"A{totalRow}"].Value = "Total";
for (int c = 0; c < regions.Count; c++)
{
    char col = (char)('B' + c);
    pivotSheet[$"{col}{totalRow}"].Formula = $"=SUM({col}2:{col}{totalRow - 1})";
}

// Apply currency formatting to the data range
var dataRange = pivotSheet[$"B2:{(char)('B' + regions.Count - 1)}{totalRow}"];
dataRange.FormatString = "$#,##0.00";

workbook.SaveAs("PivotReport.xlsx");
$vbLabelText   $csharpLabel

이는 네이티브 Excel 피벗 테이블에서 얻을 수 있는 동일한 교차 분석 요약을 생성합니다. 모든 셀, 공식 및 형식 문자열에 대해 완전한 프로그램적 제어가 제공되며 정리할 COM 객체가 없습니다.

Excel에서 C# Interop과 IronXL을 사용하여 피벗 테이블을 만드는 방법: 이미지 1 - 셀을 보여주는 피벗 테이블과 원본 Excel 파일.

지금 바로 IronXL으로 시작하세요.
green arrow pointer

엑셀 공식을 사용하여 동적 요약을 만드는 방법은?

소스 데이터가 변경될 때마다 자동 재계산되어 요약 시트가 실시간 상태로 유지되기를 원하는 시나리오의 경우, IronXL은 Excel 공식 문자열을 셀에 직접 쓸 수 있게 합니다. 이는 Interop 종속성 없이 피벗 테이블의 자동 갱신과 유사한 동작을 제공합니다.

여기의 주요 기능은 SUMIFSCOUNTIFS입니다. 다중 조건 열 조건에 기반하여 범위를 합산합니다; 일치하는 행을 계산합니다. 둘 다 이름이 지정된 워크시트에 대한 참조를 수락하므로 요약 시트를 이름으로 소스 데이터 시트에 직접 포인팅할 수 있습니다.

IronXL로 수식 기반 집계 작성 방법

using IronXL;
using System.Data;

string inputPath  = "SalesData.xlsx";
string outputPath = "DynamicSummary.xlsx";

WorkBook workbook  = WorkBook.Load(inputPath);
WorkSheet dataSheet = workbook.WorkSheets[0];

// Name the data sheet so formula references are stable
dataSheet.Name = "DataSheet";

// Convert to DataTable to enumerate unique product/region combinations
DataTable dataTable = dataSheet.ToDataTable(true);

WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary");

// Get unique product-region pairs
var uniqueCombos = dataTable.AsEnumerable()
    .Select(row => new {
        Product = row["Product"].ToString(),
        Region  = row["Region"].ToString()
    })
    .Distinct()
    .OrderBy(x => x.Product)
    .ThenBy(x => x.Region)
    .ToList();

// Header row
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Region";
summarySheet["C1"].Value = "Total Sales";
summarySheet["D1"].Value = "Count";

// Populate rows with live SUMIFS / COUNTIFS formulas
for (int i = 0; i < uniqueCombos.Count; i++)
{
    int rowIndex = i + 2;
    var combo = uniqueCombos[i];

    summarySheet[$"A{rowIndex}"].Value = combo.Product;
    summarySheet[$"B{rowIndex}"].Value = combo.Region;

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

// Grand total row
int totalRow = uniqueCombos.Count + 2;
summarySheet[$"A{totalRow}"].Value = "Total";
summarySheet[$"C{totalRow}"].Formula = $"=SUM(C2:C{totalRow - 1})";
summarySheet[$"D{totalRow}"].Formula = $"=SUM(D2:D{totalRow - 1})";

workbook.SaveAs(outputPath);
using IronXL;
using System.Data;

string inputPath  = "SalesData.xlsx";
string outputPath = "DynamicSummary.xlsx";

WorkBook workbook  = WorkBook.Load(inputPath);
WorkSheet dataSheet = workbook.WorkSheets[0];

// Name the data sheet so formula references are stable
dataSheet.Name = "DataSheet";

// Convert to DataTable to enumerate unique product/region combinations
DataTable dataTable = dataSheet.ToDataTable(true);

WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary");

// Get unique product-region pairs
var uniqueCombos = dataTable.AsEnumerable()
    .Select(row => new {
        Product = row["Product"].ToString(),
        Region  = row["Region"].ToString()
    })
    .Distinct()
    .OrderBy(x => x.Product)
    .ThenBy(x => x.Region)
    .ToList();

// Header row
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Region";
summarySheet["C1"].Value = "Total Sales";
summarySheet["D1"].Value = "Count";

// Populate rows with live SUMIFS / COUNTIFS formulas
for (int i = 0; i < uniqueCombos.Count; i++)
{
    int rowIndex = i + 2;
    var combo = uniqueCombos[i];

    summarySheet[$"A{rowIndex}"].Value = combo.Product;
    summarySheet[$"B{rowIndex}"].Value = combo.Region;

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

// Grand total row
int totalRow = uniqueCombos.Count + 2;
summarySheet[$"A{totalRow}"].Value = "Total";
summarySheet[$"C{totalRow}"].Formula = $"=SUM(C2:C{totalRow - 1})";
summarySheet[$"D{totalRow}"].Formula = $"=SUM(D2:D{totalRow - 1})";

workbook.SaveAs(outputPath);
$vbLabelText   $csharpLabel

이러한 수식은 소스 데이터에 대한 실시간 연결을 유지합니다. 누군가에 DataSheet 값을 업데이트하면, Excel은 다음 열기 또는 새로 고침 시 요약을 자동으로 다시 계산하여, 원래 피벗 테이블의 새로 고침 주기와 동일한 동작을 제공하며, COM 자동화가 필요하지 않습니다.

이전 예제에서 사용한 동일한 판매 데이터 통합 문서에 이것을 적용하면 출력은 다음과 같습니다:

Excel에서 C# Interop과 IronXL을 사용하여 피벗 테이블을 만드는 방법: 이미지 2 - 문맥에서 보이는 C# 동적 요약 출력.

이 수식 기반 접근 방식 또한 IronXL의 셀 서식 API를 사용하여 요약 셀에 조건부 서식, 데이터 막대 또는 아이콘 세트를 추가할 수 있는 기능을 제공하여 Excel UI에서 수동 작업 없이 보고서를 시각적으로 명확하게 만듭니다.

두 접근 방식은 어떻게 비교됩니까?

어떤 접근 방식을 선택하기 전에 장단점을 나란히 보는 것이 도움이 됩니다. 아래 표는 .NET 개발을 위한 가장 중요한 차원들을 다룹니다:

피벗 테이블 생성을 위한 C# Interop 대 IronXL
측면 C# Interop IronXL
오피스 필요 네 -- 모든 기계에 전체 설치 아니요 -- 독립형 NuGet 패키지
플랫폼 지원 Windows 전용 윈도우, 리눅스, macOS, Docker
메모리 관리 수동 COM 정리가 필요함 자동 .NET 가비지 수집
배포 복잡성 높음 -- 오피스 라이센스 및 설치 낮음 -- 단일 DLL 참조
성능 느림 -- 엑셀 프로세스 시작 오버헤드 빠름 -- 인메모리 계산
클라우드 호환 가능 아니요 -- Azure Functions, AWS Lambda에서 차단됨 네 -- 모든 클라우드 플랫폼에서 실행
원본 피벗 테이블 객체 네 -- 전체 엑셀 피벗 테이블 아니요 -- 집계 기반 대등물
개발 속도 느림 -- COM 복잡성 빠름 -- 유연한 관리 API
.NET 10 지원 제한됨 -- COM 바인딩 문제 전체 -- 현대 .NET 타겟팅

Interop이 명확한 이점을 가지는 유일한 시나리오는 XLSX 파일에 네이티브 엑셀 피벗 테이블 객체가 반드시 필요한 경우입니다 -- 예를 들어, 하류 사용자가 엑셀의 기본 피벗 테이블 UI를 사용하여 상호적으로 드릴링 다운, 필터링, 집계 함수 변경 등 작업을 해야 할 때입니다. 다른 모든 시나리오에서는 IronXL의 접근 방식이 작성하기 빠르고, 배포하기 더 쉽고, 훨씬 더 이식성이 뛰어납니다.

어떤 접근 방식을 선택해야 하나요?

올바른 선택은 배포 환경과 사용자의 필요에 따라 다릅니다.

C# Interop을 선택해야 하는 경우:

  • 사용자가 엑셀 UI 내에서 상호작용적으로 조작할 수 있는 네이티브 엑셀 피벗 테이블 객체가 필요할 때
  • 오피스가 모든 기계에 설치될 것이 보장되는 폐쇄형 Windows 데스크탑 환경을 대상으로 할 때
  • 이미 Interop에 의존하는 레거시 .NET Framework 코드를 유지하고 있고 현재 리포트가 정당화되지 않을 때

IronXL을 선택할 때:

  • 서버, 컨테이너 또는 모든 클라우드 환경(Azure, AWS, GCP)에 배포할 때
  • Linux, macOS, Docker 기반 빌드를 위한 크로스 플랫폼 지원이 필요할 때
  • COM 라이프사이클 관리를 피하고 깨끗한 유지 가능한 코드를 원할 때
  • .NET 5, 6, 7, 8, 9, 또는 10을 대상으로 할 때
  • 서버 인프라에서 Microsoft Office 라이센스 비용을 피하고 싶을 때
  • 파일당 엑셀 프로세스 시작 없이 많은 워크북을 빠르게 일괄 처리할 필요가 있을 때

대부분의 현대 .NET 응용 프로그램에 대해 IronXL은 실용적인 선택입니다. 집계 기반 출력은 모든 실제 보고 요구 사항을 충족하며, 그 대가로 완전한 이식성을 얻습니다.

IronXL 문서IronXL 예제 라이브러리를 통해 셀 서식, 수식 평가, 데이터 유효성 검사 및 차트 생성 등의 추가 기능을 탐색할 수 있습니다.

IronXL을 시작하는 방법은 무엇입니까?

IronXL 라이브러리는 NuGet에서 사용할 수 있으며, 모든 .NET 프로젝트에 1분 내로 추가할 수 있습니다:

Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

설치 후 기존 워크북을 로드하거나 새로 만들고, 셀 값을 읽고 쓰고, 수식을 적용하며, 형식 문자열을 설정하고, XLSX로 저장할 수 있습니다. 이러한 모든 작업은 깨끗하고 잘 문서화된 API를 사용하여 수행됩니다. COM이 없고, Office 의존성이 없으며, 특별한 서버 설정이 필요하지 않습니다.

전체 API 문서를 보려면 IronXL 시작 가이드, C# Excel Interop 마이그레이션 가이드, 및 IronXL 코드 예제를 참조하세요. 또한 IronXL 비교 기사에서 IronXL을 다른 Excel 라이브러리와 비교할 수 있습니다.

무료 체험 라이센스를 사용하여 커밋하기 전에 여러분의 프로젝트에서 전체 기능을 테스트할 수 있습니다. 프로덕션에 배포할 준비가 되었을 때 상업적 IronXL 라이센스는 체험판 워터마크를 제거하고 우선 지원을 포함합니다. 무료 체험판으로 시작하고, 크로스 플랫폼 Excel 자동화가 얼마나 간단해질 수 있는지 확인하세요.

자주 묻는 질문

Interop 없이 C#을 사용하여 Excel에서 피벗 테이블을 만드는 방법은 무엇인가요?

IronXL 사용하면 Office 종속성 없이도 강력한 데이터 조작 기능을 제공하여 C#을 이용해 Excel에서 피벗 테이블을 만들 수 있습니다.

IronXL 사용하여 피벗 테이블을 생성하는 데에는 어떤 장점이 있습니까?

IronXL 사용하면 개발자는 Excel Interop에 의존하지 않고 피벗 테이블을 생성할 수 있으므로 Office 설치가 필요 없어지고 배포 복잡성이 줄어듭니다.

IronXL .NET 애플리케이션과 호환됩니까?

네, IronXL .NET 애플리케이션과 완벽하게 호환되며, 피벗 테이블 생성 등 Excel 작업을 위한 사용하기 쉬운 API를 제공합니다.

IronXL 사용하려면 서버에 Excel이 설치되어 있어야 합니까?

아니요, IronXL 서버에 Excel이 설치되어 있을 필요가 없습니다. 독립적으로 작동하며 서버 측 애플리케이션에 원활하게 통합될 수 있습니다.

IronXL 사용하여 Excel의 데이터를 조작할 수 있습니까?

네, IronXL 강력한 데이터 조작 기능을 제공하여 개발자가 피벗 테이블 생성 등을 포함하여 Excel 데이터를 생성, 수정 및 분석할 수 있도록 지원합니다.

개발자들이 기존의 상호 운용 방식보다 IronXL 선호하는 이유는 무엇일까요?

개발자들은 기존의 상호 운용 방식보다 IronXL 선호할 수 있는데, 이는 IronXL이 Office 종속성이 없고 배포가 간편하며 Excel 작업에 필요한 포괄적인 기능을 제공하기 때문입니다.

IronXL Excel 데이터 조작을 위해 어떤 기능을 제공합니까?

IronXL Excel Interop 없이도 Excel 파일 읽기 및 쓰기, 스프레드시트 생성 및 편집, 피벗 테이블 생성과 같은 기능을 제공합니다.

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

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

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

Iron Support Team

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