IRONSOFTWAREHOME
IRONXL 사용하여

Excel이 설치되어 있지 않은 상태에서 C#으로 Open Office Excel 파일을 읽는 방법

Curtis Chau
Curtis Chau
Updated: 2026년 6월 28일

C#에서 OpenDocument 스프레드시트(ODS) 및 Excel 파일을 읽고 처리하는 것은 올바른 라이브러리를 사용할 때 간단합니다. IronXL을 사용하면, IronXL을 통해 Microsoft Excel 설치가 필요 없이, COM 등록 없이, 상호 운용성 문제 없이WorkBook 객체에 XLS, XLSX, ODS, 또는 CSV 파일을 단일 메서드 호출로 로드할 수 있습니다. 이 가이드는 Install-Package, 파일 로드, 유형화된 셀 값 추출, 이름 지정된 워크시트 작업, 병합된 셀 처리 및 Linux 또는 컨테이너화된 환경에 배포하는 모든 단계를 안내합니다.

IronXL을 .NET 프로젝트에 어떻게 설치합니까?

NuGet 패키지 관리자 설치

NuGet 패키지 관리자를 통해 프로젝트에 IronXL을 추가하세요. Visual Studio에서 패키지 관리자 콘솔을 열고 다음을 실행하세요:

PM > Install-Package IronXL.Excel

IronXL은 .NET 8, .NET 9, .NET 10, .NET Framework 4.6.2+, 그리고 .NET Standard 2.0을 대상으로 하므로 현대 및 레거시 코드베이스에 모두 적합합니다. 패키지가 설치되면, 스프레드시트와 작동하는 파일 맨 위에 using IronXL; 지시문을 추가하면 첫 번째 워크북 로드를 준비할 수 있습니다.

Azure Functions, Docker 컨테이너 또는 리눅스에 호스팅된 API의 경우 추가적인 런타임 구성이 필요하지 않습니다. 라이브러리는 필요한 모든 것을 내부에 번들로 포함하고 있으며, Excel 자동화 구성 요소를 호출하지 않습니다.

OpenOffice 또는 Excel 파일을 C#에서 어떻게 로드합니까?

IronXL은 WorkBook.Load 메서드를 통해 ODS, XLS, XLSX, 및 CSV 파일을 동일하게 처리합니다. 절대 파일 경로나 상대 파일 경로를 전달하면, 라이브러리는 파일 확장자가 아닌 파일 헤더에서 형식을 감지합니다. 이는 .ods에서 .xlsx으로 이름이 변경된 파일도 여전히 올바르게 읽힌다는 것을 의미합니다.

using IronXL;

// Load an OpenDocument Spreadsheet (.ods) produced by LibreOffice Calc or OpenOffice
WorkBook workbook = WorkBook.Load("quarterly_report.ods");

// Access the first worksheet by index
WorkSheet sheet = workbook.WorkSheets[0];

// Read a cell value
string companyName = sheet["A1"].StringValue;
int recordCount   = sheet["B1"].IntValue;

Console.WriteLine($"Company : {companyName}");
Console.WriteLine($"Records : {recordCount}");

같은 호출이 XLSX 및 XLS 파일에서도 작동합니다 -- 경로만 변경하세요. 출처 형식에 관계없이 WorkBook.Load는 동일한 강력한 유형의 객체를 반환하므로, 코드 나머지는 파일이 Microsoft Excel, LibreOffice, 또는 다른 ODF-준수 응용 프로그램에서 발생했는지 여부와 관계없이 동일하게 유지됩니다.

워크시트에서 모든 행과 셀을 어떻게 읽습니까?

행 컬렉션 반복

모든 행과 셀을 반복하는 것은 가장 일반적인 Excel 처리 작업입니다 -- 데이터 가져오기를 검증하거나, 레코드를 변환하거나, 보고 파이프라인에 공급할 때. IronXL은 모든 WorkSheet에 대해 Rows 컬렉션을 노출합니다.

using IronXL;

WorkBook workbook  = WorkBook.Load("customers.xlsx");
WorkSheet worksheet = workbook.WorkSheets[0];

Console.WriteLine($"Total rows    : {worksheet.RowCount}");
Console.WriteLine($"Total columns : {worksheet.ColumnCount}");
Console.WriteLine();

foreach (var row in worksheet.Rows)
{
    foreach (var cell in row)
    {
        if (!cell.IsEmpty)
            Console.Write($"{cell.StringValue,-20}");
    }
    Console.WriteLine();
}

RowCountColumnCount 속성은 채워진 범위만 반환합니다 -- 빈 후행 행과 열은 포함되지 않습니다. 읽기 전에 cell.IsEmpty을(를) 체크하면 드문 시트에 대해 불필요한 처리를 방지할 수 있습니다.

대형 파일의 경우 전체 시트 반복 대신 범위 기반 액세스 (worksheet["A1:D500"])를 고려하십시오. 이는 메모리에 로드되는 셀의 수를 제한하고, 필요한 데이터의 하위 집합만 있을 때 처리 속도를 높입니다.

셀에서 형식화된 값을 어떻게 추출합니까?

형식화된 속성 접근자

실제 세계의 스프레드시트에서는 문자열, 정수, 소수, 불리언 및 날짜가 포함됩니다. IronXL은 전용 형식화된 속성을 노출하여 원시 문자열을 수동으로 파싱할 필요가 없습니다:

using IronXL;

WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet sheet   = workbook.GetWorkSheet("Products");

// Typed accessors handle conversion automatically
string  productName = sheet["A2"].StringValue;
int     quantity    = sheet["B2"].IntValue;
decimal unitPrice   = sheet["C2"].DecimalValue;
bool    inStock     = sheet["D2"].BoolValue;
DateTime? lastAudit = sheet["E2"].DateTimeValue;

Console.WriteLine($"Product  : {productName}");
Console.WriteLine($"Qty      : {quantity}");
Console.WriteLine($"Price    : {unitPrice:C}");
Console.WriteLine($"In Stock : {inStock}");
Console.WriteLine($"Audited  : {lastAudit?.ToString("d") ?? "Never"}");

셀에 수식이 포함된 경우, IronXL은 이를 평가하고 동일한 형식화된 속성을 통해 계산된 결과를 반환합니다. 별도의 평가 메서드를 호출할 필요가 없습니다. 빈 값 또는 호환되지 않는 형식이 포함될 수 있는 셀의 경우, 라이브러리는 예외를 발생시키는 대신 해당 형식에 대한 기본값을 반환합니다. 이는 입력 검증 로직을 단순화합니다.

IronXL 셀 값 속성 및 그에 상응하는 .NET 형식
재산.NET 형식비어 있을 때 반환노트
StringValue 문자열빈 문자열항상 안전함; 모든 셀을 텍스트로 변환
IntValueINT0소수를 잘라냄
DecimalValue숫자0m재무 데이터를 위한 정밀도를 유지
DoubleValue더블0.0과학적이거나 통계적 값에 사용
BoolValueboolfalseExcel TRUE/FALSE 셀을 읽음
DateTimeValueDateTime?nullNullable -- 사용 전에 확인

여러 이름이 지정된 워크시트를 어떻게 작업합니까?

이름, 인덱스 또는 반복으로 접근

기업용 스프레드시트는 종종 여러 이름이 지정된 시트를 포함합니다 -- 월별, 지역별 또는 제품 라인별로 하나씩. IronXL은 여러 방법으로 이들에 접근할 수 있게 합니다:

using IronXL;

WorkBook workbook = WorkBook.Load("annual_sales.xlsx");

// Option 1: access by name (throws if the sheet does not exist)
WorkSheet januarySheet = workbook.GetWorkSheet("January");

// Option 2: iterate all sheets in the workbook
foreach (WorkSheet ws in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {ws.Name}  |  Rows: {ws.RowCount}");

    // Read the header row from each sheet
    string header = ws["A1"].StringValue;
    Console.WriteLine($"  Header: {header}");
}

// Option 3: access by zero-based index
WorkSheet lastSheet = workbook.WorkSheets[workbook.WorkSheets.Count - 1];
Console.WriteLine($"Last sheet: {lastSheet.Name}");

시트 이름이 설계 시간에 알려진 경우 GetWorkSheet(이)가 가장 명확한 옵션입니다. 사용자 입력 또는 구성에서 시트 이름이 오는 동적 처리의 경우, WorkSheets 컬렉션을 반복하면 하드코딩된 가정을 방지하고, 가변적인 시트 수를 가진 워크북을 처리합니다.

병합된 셀과 서식이 지정된 영역을 어떻게 처리하나요?

보고서와 대시보드는 종종 헤딩, 그룹화된 레이블, 요약 행을 위해 병합된 셀을 사용합니다. IronXL은 병합된 영역의 좌상단 셀 값을 읽는데 이는 엑셀이 표시하는 것과 정확히 같습니다:

using IronXL;

WorkBook workbook = WorkBook.Load("report_with_merges.xlsx");
WorkSheet sheet   = workbook.DefaultWorkSheet;

// The merged region A1:D1 stores its value in cell A1
string reportTitle = sheet["A1"].StringValue;
Console.WriteLine($"Report title : {reportTitle}");

// Read cell formatting metadata
var titleCell = sheet["A1"];
Console.WriteLine($"Bold         : {titleCell.Style.Font.Bold}");
Console.WriteLine($"Font size    : {titleCell.Style.Font.Height}");

// Scan an entire column for non-empty section headers
foreach (var cell in sheet["A1:A100"])
{
    if (!cell.IsEmpty && cell.Style.Font.Bold)
        Console.WriteLine($"Section header at {cell.AddressString}: {cell.StringValue}");
}

Style 속성 트리는 OOXML SpreadsheetML 사양의 구조를 반영하므로, Open XML SDK를 사용한 경험이 있다면 속성 이름이 익숙하게 느껴질 것입니다. 하지만 IronXL은 모든 복잡성을 클린한 API로 감싸서, 여러분이 XML 조작을 하지 않아도 됩니다.

같은 API로 CSV 파일을 어떻게 가져오나요?

데이터베이스 내보내기, CRM 시스템, 레거시 응용 프로그램에서 생성된 CSV 파일은 동일한 WorkBook.Load 호출을 통해 읽을 수 있습니다. IronXL은 파일 내용에서 구분자를 추론합니다:

using IronXL;

// Load a comma-separated values file -- same method, same API
WorkBook csvWorkbook  = WorkBook.Load("export.csv");
WorkSheet csvSheet    = csvWorkbook.DefaultWorkSheet;

Console.WriteLine($"CSV rows loaded: {csvSheet.RowCount}");

// Process rows exactly like any other worksheet
foreach (var row in csvSheet.Rows)
{
    string id   = row[0].StringValue;
    string name = row[1].StringValue;
    Console.WriteLine($"{id,-10} {name}");
}

로드한 후 csvWorkbook.SaveAs("output.xlsx")를 사용하여 데이터를 XLSX로 저장할 수 있습니다. 이는 CSV-엑셀 변환 파이프라인의 일반적인 패턴입니다 -- CSV 파일을 받아 계산된 열 또는 형식으로 강화하고, 사용자에게 형식이 지정된 XLSX 보고서를 반환합니다.

탭으로 구분된 파일이나 사용자 지정 구분 기호의 경우, WorkBook.LoadCSV("file.tsv", fileFormat: ExcelFileFormat.TSV)를 사용하여 형식을 명시적으로 지정하십시오.

IronXL이 지원하는 입력 파일 형식
형식확장자제작자노트
XLSX.xlsxExcel 2007 이상, LibreOffice기본 현대 형식; XML 기반
XLS.xlsExcel 97–2003바이너리 형식; 전체 읽기/쓰기 지원
ODS.ods리브레오피스, 오픈오피스OpenDocument 스프레드시트 표준
CSV.csv어떠한 애플리케이션구분자가 자동으로 감지됨; 형식 없음
TSV.tsv데이터베이스 내보내기탭으로 구분됨; 형식을 명시적으로 지정하세요

IronXL과 Microsoft.Office.Interop.Excel은 어떻게 비교되나요?

Interop, Open XML SDK 및 IronXL 비교

.NET에서 Excel 자동화에 대한 IronXL의 가장 일반적인 대안은 Microsoft.Office.Interop.Excel입니다. 이점과 단점을 이해하면 프로젝트에 적합한 도구를 선택하는 데 도움이 됩니다.

Microsoft Interop은 Excel COM 객체 모델을 감쌉니다. 즉, 코드를 실행하는 모든 컴퓨터에 Excel이 설치되어 있어야 하며, 여기에는 웹 서버, 빌드 에이전트 및 클라우드 VM도 포함됩니다. COM 객체 수명 주기 관리는 수동입니다: 명시적으로 모든 Range, Worksheet, 및 Workbook 객체를 해제해야 하며, 그렇지 않으면 Excel 프로세스가 백그라운드에서 축적되어 서버가 재시작될 때까지 메모리를 소비합니다. 라이선스 문제도 있는데: Office EULA는 많은 경우 서버 측 자동화를 금지합니다.

IronXL은 이러한 모든 제약을 피합니다. 순수 관리형 라이브러리로 COM 의존성이 없습니다. WorkBook 객체는 표준 .NET 클래스입니다; 가비지 수집기가 정리를 처리합니다. 개발자 노트북, Azure App Service, Docker 컨테이너 또는 Linux를 실행하는 Raspberry Pi에서 동일한 코드를 실행할 수 있습니다.

Microsoft의 Open XML SDK는 또 다른 대안입니다. 직접 OOXML 파일 형식에 액세스할 수 있습니다 - Excel이 필요 없지만 매우 낮은 단계에서 작동합니다 -- XML 요소를 직접 조작해야 합니다. 하나의 셀 값을 읽으려면 공유 문자열 테이블, 셀 참조 및 스타일 인덱스를 탐색해야 합니다. IronXL은 본 가이드 전체에서 표시된 단일 sheet["A1"].StringValue 호출로 모든 것을 감싸고 있습니다.

Excel 처리를 Linux와 Docker에 어떻게 배포하나요?

서버 배포는 IronXL의 Excel 독립성이 가장 가치 있는 부분입니다. Windows에서 작성한 동일한 코드를 Ubuntu, Alpine Linux, 또는 macOS에서 변경 없이 실행할 수 있습니다. 컨테이너화된 배포의 경우, Dockerfile에 특별한 설정이 필요 없습니다:

# Standard .NET runtime image -- no Office packages needed
FROM mcr.microsoft.com/dotnet/runtime:10.0
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "ExcelProcessor.dll"]
SHELL

Azure Functions 및 AWS Lambda의 경우, 추가 설정 없이 관리되는 런타임 내에서 IronXL이 작동합니다. 콜드 스타트 오버헤드는 COM 초기화 단계가 없으므로 최소화됩니다.

스레드 안전성이 내장되어 있습니다: 여러 스레드가 서로 간섭 없이 다양한 WorkBook 인스턴스를 동시에 열 수 있습니다. 배경 작업에서 사용자 업로드 스프레드시트를 수집하는 예를 들어, 수천 개의 파일을 병렬로 처리해야 하는 경우, Parallel.ForEach 또는 Task.WhenAll을(를) WorkBook 인스턴스 풀에 걸쳐 사용할 수 있으며, 손상 위험 없이 가능합니다.

IronXL은 요청된 워크시트만 메모리에 로드하므로 메모리 사용량이 예측 가능합니다. 초기화 시 전체 워크북을 메모리에 로드하지 않습니다. 매우 큰 파일의 경우, 이 구분이 중요합니다: 50MB 시트 10개로 구성된 워크북은 단일 시트를 읽는 데 500MB의 RAM이 필요하지 않습니다. IronXL 성능 문서에서는 고용량 파일 처리 시나리오를 처리하기 위한 추가 전략을 다룹니다.

다음 단계는 무엇입니까?

프로젝트에서 IronXL을 검증하는 가장 빠른 방법은 NuGet 패키지를 설치하고 이 가이드의 예제를 실제 환경의 파일에 대해서 실행하는 것입니다. 무료 체험판 라이선스는 코드 변경 없이 모든 기능을 잠금 해제하여 상용 제품 준비가 완료됩니다.

파일 읽기를 보완하는 관련 IronXL 기능탐색:

라이선스, 크로스 플랫폼 지원 또는 특정 파일 형식 요구 사항에 대한 질문은 IronXL 지원 팀이 라이브 채팅 및 이메일을 통해 가능합니다.

첫 번째 단계:
arrow pointer
Curtis Chau
기술 문서 작성자

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

...
더 읽어보기

관련 기사

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

전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.

Iron Software의 고객 로고
부담 없는 무료 상담을 받아보세요
아래 양식을 작성하시거나 sales@ironsoftware.com으로 이메일을 보내주세요.
고객님의 정보는 항상 비밀로 유지됩니다.
전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.
Iron Software의 고객 로고
지금 바로 30일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.