이글에서는 Excel 설치 없이 Excel 파일을 다룹니다. xlsx는 Microsoft Excel에서 사용되는 오픈 XML 스프레드시트 파일 형식의 파일 확장자입니다. Office Open XML 형식을 기반으로 합니다.
C# 으로 Excel 설치 없이 Excel 파일을 작성 및 작업하도록 하겠습니다.
Excel 설치시 Excel 작업하기
만약 Excel 이 설치되어져 있고 COM 에 등록되어져 있다면 다음 글에서 더 쉽게 Excel 을 작업 하실 수 있습니다.
ClosedXML 소개
ClosedXML은 Excel 2007+ (.xlsx, .xlsm) 파일을 읽고 조작하고 쓰기 위한 .NET 라이브러리입니다.
Nuget 패키지 관리 창을 열고 다음 패키지를 추가 합니다.
프로젝트에 패키지를 추가합니다.
Excel 예제
Excel 단순 예제
첫 번째 예제에서는 ClosedXML로 새로운 xlsx 파일을 만드는 방법을 보여줍니다.
using System;
using ClosedXML.Excel;
class Program
{
static void Main(string[] args)
{
using (var wbook = new XLWorkbook())
{
var ws = wbook.Worksheets.Add("Sheet1");
ws.Cell("A1").Value = "150";
wbook.SaveAs("simple.xlsx");
}
}
}
새 Excel 파일을 만들고 셀에 값을 작성합니다.
using var wbook = new XLWorkbook();
새로운 XLWorkbook이 생성됩니다.
var ws = wbook.Worksheets.Add("Sheet1");
워크북에 새 시트를 추가합니다.
ws.Cell("A1").Value = "150";
열(column):A 행(row):1 인 “A1” 셀에 값을 작성합니다.
wbook.SaveAs("simple.xlsx");
워크북은 SaveAs 메서드를 사용하여 저장됩니다.
Excel 셀 편집 예제
셀은 행(row)과 열(column) 교차점입니다. 각 셀은 열 문자와 행 번호로 구성된 고유한 주소를 가지고 있습니다. 예를 들어, 시트의 좌측 상단에 있는 첫 번째 셀의 주소는 A1입니다.
using System;
using ClosedXML.Excel;
class Program
{
static void Main(string[] args)
{
using (var wbook = new XLWorkbook())
{
var ws = wbook.AddWorksheet("Sheet1");
ws.FirstCell().Value = 150;
ws.Cell(2, 2).Value = "website name is harostudio";
ws.Cell("A3").SetValue("하로스튜디오").SetActive();
ws.Columns().AdjustToContents();
wbook.SaveAs("data.xlsx");
}
}
}
출력된 Excel 은 다음과 같습니다.
이 예에서는 셀 작업을 수행합니다.
ws.FirstCell().Value = 150;
시트의 첫 번째 셀에 대한 참조를 가져옵니다. FirstCellValue 속성을 사용하여 값을 150으로 설정합니다.
ws.Cell(2, 2).Value = "website name is harostudio";
셀을 참조하는 또 다른 방법은 행 및 열 번호를 매개변수로 사용하는 오버로드된 메서드를 사용하는 것입니다. Cell 메서드를 사용합니다.
ws.Cell("A3").SetValue("하로스튜디오").SetActive();
주소(A3) 셀에 값(“하로스튜디오”)을 씁니다. SetActive()는 현재 포커스를 A3에 두겠다는 의미입니다. 나중에 Excel 프로그램으로 문서를 열면 A3에 포커스 되어 있습니다.
ws.Column(2).AdjustToContents();
두 번째 열의 너비를 내용에 맞게 조정합니다. “website name is harostudio”라는 값이 완전히 표시됩니다.
C# Excel 파일 읽기 예제
다음 예에서는 이전에 생성된 Excel 파일에서 읽습니다.
using System;
using ClosedXML.Excel;
class Program
{
static void Main(string[] args)
{
using (var wbook = new XLWorkbook("simple.xlsx"))
{
var ws1 = wbook.Worksheet(1);
var data = ws1.Cell("A1").GetValue<string>();
Console.WriteLine(data);
}
}
}
출력은 다음과 같습니다.
150
이 예에서는 셀에서 값을 읽습니다.
using var wbook = new XLWorkbook("simple.xlsx");
워크북을 엽니다.
var ws1 = wbook.Worksheet(1);
첫 번째 시트로 이동합니다.
var data = ws1.Cell("A1").GetValue<string>();
GetValue() 메서드를 사용하여 A1 셀의 값을 읽습니다.
Excel 스타일 적용
스타일은 속성을 통해 적용할 수 있습니다.
using System;
using ClosedXML.Excel;
class Program
{
static void Main(string[] args)
{
using (var wbook = new XLWorkbook())
{
var ws = wbook.Worksheets.Add("Sheet1");
var c1 = ws.Column("A");
c1.Width = 25;
var c2 = ws.Column("B");
c2.Width = 15;
ws.Cell("A3").Value = "HaroStudio";
ws.Cell("B2").Value = "150";
ws.Cell("B5").Value = "C# ClosedXml";
ws.Cell("A3").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
ws.Cell("A3").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
ws.Cell("A3").Style.Font.Italic = true;
ws.Cell("B2").Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
ws.Cell("B5").Style.Font.FontColor = XLColor.Red;
wbook.SaveAs("styled.xlsx");
}
}
}
출력은 다음과 같습니다.
이 예에서는 셀에 스타일을 적용합니다.
var c1 = ws.Column("A");
c1.Width = 25;
var c2 = ws.Column("B");
c2.Width = 15;
A 및 B 열의 너비를 설정합니다.
ws.Cell("A3").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
ws.Cell("A3").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
ws.Cell("A3").Style.Font.Italic = true;
A3 셀에서 텍스트를 가로 및 세로 중앙 정렬하고 이탤릭체로 설정합니다.
ws.Cell("B2").Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
B2 셀에 얇은 테두리를 설정합니다.
ws.Cell("B5").Style.Font.FontColor = XLColor.Red;
B5 셀의 글꼴 색상을 빨간색으로 설정합니다.
Excel 범위
범위는 하나 이상의 셀 그룹입니다. 범위 주소는 상단 왼쪽 셀 주소와 하단 오른쪽 주소를 콜론으로 구분하여 지정합니다.
단일 범위는 Range(“D2:E2”) 처럼 : 를 사용하여 범위를 지정합니다.
여러 범위는 Ranges(“C5, F5:G8”) 처럼 인자로 여러 범위를 , 으로 구분하여 생성합니다.
using System;
using ClosedXML.Excel;
class Program
{
static void Main(string[] args)
{
using (var wbook = new XLWorkbook())
{
var ws = wbook.Worksheets.Add("Sheet1");
ws.Range("D2:E2").Style.Fill.BackgroundColor = XLColor.Gray;
ws.Ranges("C5, F5:G8").Style.Fill.BackgroundColor = XLColor.Gray;
var rand = new Random();
var range = ws.Range("C10:E15");
foreach (var cell in range.Cells())
{
cell.Value = rand.Next();
}
ws.Column("C").AdjustToContents();
ws.Column("D").AdjustToContents();
ws.Column("E").AdjustToContents();
wbook.SaveAs("ranges.xlsx");
}
}
}
출력은 다음과 같습니다.
이 예에서는 범위 작업을 수행합니다.
ws.Range("D2:E2").Style.Fill.BackgroundColor = XLColor.Gray;
D2:E2 범위의 배경색을 변경합니다.
ws.Ranges("C5, F5:G8").Style.Fill.BackgroundColor = XLColor.Gray;
여기서 두 개의 범위의 배경색을 변경합니다.
var rand = new Random();
var range = ws.Range("C10:E15");
foreach (var cell in range.Cells())
{
cell.Value = rand.Next();
}
범위의 각 셀에 랜덤 값을 설정합니다. Cells 메서드를 사용하여 범위의 셀을 가져옵니다.
Excel 셀 병합
셀을 병합하려면 .Merge 메서드를 사용합니다.
using System;
using ClosedXML.Excel;
class Program
{
static void Main(string[] args)
{
using (var wbook = new XLWorkbook())
{
var ws = wbook.Worksheets.Add("Sheet1");
ws.Cell("A1").Value = "HaroStudio";
ws.Cell("A1").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
ws.Cell("A1").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
ws.Range("A1:B2").Merge();
wbook.SaveAs("merged.xlsx");
}
}
}
출력은 다음과 같습니다.
네 개의 셀을 하나로 병합합니다.
ws.Range("A1:B2").Merge();
범위 A1부터 B2까지의 셀을 병합합니다.
Excel 정렬
Sort 메서드를 사용하여 정렬할 수 있습니다.
using System;
using ClosedXML.Excel;
class Program
{
static void Main(string[] args)
{
using (var wbook = new XLWorkbook())
{
var ws = wbook.Worksheets.Add("Sheet1");
var rand = new Random();
var range = ws.Range("A1:A15");
foreach (var cell in range.Cells())
{
cell.Value = rand.Next(1, 100);
}
ws.Sort("A");
wbook.SaveAs("sorted.xlsx");
}
}
}
출력은 다음과 같습니다.
A 열에 대해 15개의 랜덤 값을 추가합니다. 그런 다음 .Sort 메서드를 사용하여 열을 정렬합니다.
Excel 자동필터
정렬
using var wb = new XLWorkbook();
var ws = wb.AddWorksheet();
var range = ws.Cell("B3").InsertData(new[]
{
new object[]{ "Pastry", "Sold", "Margin" },
new object[]{ "Cake", 14, 0.25 },
new object[]{ "Croissant", 15, 0.60 },
new object[]{ "Fig Roll", 56, 0.50 },
new object[]{ "Waffle", 74, 0.60 },
});
// Sort by margin
range.SetAutoFilter().Sort(3, XLSortOrder.Descending);
wb.SaveAs(@"c:\temp\issues\autofilter-sort-example.xlsx");
결과는 다음과 같습니다.
레귤러 필터
using ClosedXML.Excel;
using var wb = new XLWorkbook();
var ws = wb.AddWorksheet();
ws.Column("B").Width = 12;
var range = ws.Cell("B3").InsertData(new object[]
{
"Header",
"Text",
7,
new DateTime(2020, 1, 5),
new DateTime(2020, 1, 14),
"7",
new DateTime(2020, 2, 5)
});
range.SetAutoFilter().Column(1).AddFilter("7");
wb.SaveAs("autofilter-filter-regular-example.xlsx");
결과물은 다음과 같습니다.
그밖의 기능들
공식 WebSite를 통해서 각 기능들을 확인하실 수 있습니다.
ClosedXML — ClosedXML 0.102.0 documentation
대표적으로 다음과 같은 함수들이 있습니다.
- PivotTables
- Protection
- FormulaA1
- Evaluate
- CellsUsed
결론
이글에서는 C# 으로 Microsoft.Office.Excel 설치 없이 Excel 파일 .xlsx 파일을 다루는 방법에 대해서 다뤄보았습니다.