Language/C# WPF

[C#] Excel 엑셀파일 읽어서 DataGridView 출력하기 EPPlus

멱군 2023. 4. 6. 05:09

EPPlus는 비상업적 사용에 대해 무료이며, 상업적 사용에는 라이선스 구매가 필요합니다. 이번 글에서는 C#과 EPPlus를 사용하여 Excel 파일을 읽고 데이터를 DataGridView에 출력하는 방법을 살펴보겠습니다.

 

 

1. 문제의 발단

 

[C#] Excel 엑셀파일 읽어서 원하는 셀 값 출력하기

C#을 사용하여 Excel 파일을 읽고 특정 셀의 데이터를 추출하는 것은 데이터 처리와 분석에 있어 매우 중요한 기능입니다. 본 포스트에서는 C# Windows Forms 애플리케이션을 통해 Excel 파일을 읽고, 사

devit.koreacreatorfesta.com

이전에는 'Microsoft.Office.Interop.Excel'을 이용해 C#에서 Excel 파일을 읽고 특정 셀 값을 출력하는 방법을 다뤘습니다

하지만 이 방법은 Excel이 설치된 컴퓨터에서만 사용 가능하며, 서버 배포나 가벼운 솔루션을 원하는 경우에는 최적의 방법이 아닐 수 있습니다.

 

2. EPPlus 라이브러리 설치 및 설정

EPPlus는 Excel 파일을 다루기 위한 .NET 라이브러리입니다.

아래의 링크를 통해서 EPPlus 라이브러리를 다운로드 받을 수 있습니다.

 

PolyForm Noncommercial License 1.0.0 – Polyform Project

https://polyformproject.org/licenses/noncommercial/1.0.0 Acceptance In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses. Copyright License The licensor grants you a copyright

polyformproject.org

 

EPPlus 5 버전 이상부터는 라이선스 정책이 변경되었으므로, 라이센스를 자세히 읽어 봐야 하는데, 개인적인 용도로 예상되는 상업적 적용 없이 공공 지식, 개인 학습, 개인 오락, 취미 프로젝트, 아마추어 추구 또는 종교 의식의 이익을 위한 연구, 실험 및 테스트를 위한 개인적인 사용은 허용된 목적으로 사용하는 것도 허락한다고 합니다.

## LicenseContext parameter must be set
With the license change EPPlus has a new parameter that needs to be configured. If the LicenseContext is not set, EPPlus will throw a LicenseException (only in debug mode).

This is a simple configuration that can be set in a few alternative ways:

### 1. Via code
```csharp
// If you are a commercial business and have
// purchased commercial licenses use the static property
// LicenseContext of the ExcelPackage class :
ExcelPackage.LicenseContext = LicenseContext.Commercial;

// If you use EPPlus in a noncommercial context
// according to the Polyform Noncommercial license:
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
    
using(var package = new ExcelPackage(new FileInfo("MyWorkbook.xlsx")))
{

}

 

다운로드 후, LicenseContext를 설정해야 합니다.

개인적, 비상업적 사용을 위해서는 다음과 같이 설정합니다.

ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

 

3. ExcelEPPlusReader 클래스 구현

EPPlus를 사용하여 Excel 파일의 데이터를 읽고 DataTable로 변환하는 클래스를 구현합니다.

using OfficeOpenXml;
using System.Data;
using System.IO;

namespace sellercatagory
{
    internal class ExcelEPPlusReader
    {
        DataTable dataTable;
        public ExcelEPPlusReader(string filePath)
        {
            if (dataTable != null) dataTable.Clear();
            else dataTable = new DataTable();

            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (var package = new ExcelPackage(new FileInfo(filePath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 첫 번째 워크시트 접근
                int rowCount = worksheet.Dimension.Rows;
                int colCount = worksheet.Dimension.Columns;

                // 열 제목 설정
                for (int col = 1; col <= colCount; col++)
                {
                    dataTable.Columns.Add(worksheet.Cells[1, col].Value.ToString());
                }

                // 행 데이터 추가
                for (int row = 2; row <= rowCount; row++)
                {
                    DataRow dataRow = dataTable.NewRow();
                    for (int column = 1; column <= colCount; column++)
                    {
                        dataRow[column - 1] = worksheet.Cells[row, column].Value;
                    }
                    dataTable.Rows.Add(dataRow);
                }
            }
        }

        public DataTable GetWorksheetData()
        {
            return dataTable;
        }
    }
}

DataGridView를 사용할 때 source 값은 dataTable이기 때문에 여기에 값을 넣어줘야 합니다.

for (int col = 1; col <= colCount; col++)
{
      dataTable.Columns.Add(worksheet.Cells[1, col].Value.ToString());
}

이 부분은 엑셀 첫 번째행을 컬럼명으로 만드는 부분입니다.

만약 첫째 행이 컬럼이 아니라면, 이 소스를 삭제합니다. 그리고 `//행 데이터 추가` 에 있는 int row=2 -> row=1로 변경하시면 됩니다.

using OfficeOpenXml;
using System.Data;
using System.IO;

namespace sellercatagory
{
    internal class ExcelEPPlusReader
    {
        DataTable dataTable;
        public ExcelEPPlusReader(string filePath)
        {
            if (dataTable != null) dataTable.Clear();
            else dataTable = new DataTable();

            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (var package = new ExcelPackage(new FileInfo(filePath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 첫 번째 워크시트 접근
                int rowCount = worksheet.Dimension.Rows;
                int colCount = worksheet.Dimension.Columns;


                // 행 데이터 추가
                for (int row = 2; row <= rowCount; row++)
                {
                    DataRow dataRow = dataTable.NewRow();
                    for (int column = 1; column <= colCount; column++)
                    {
                        dataRow[column - 1] = worksheet.Cells[row, column].Value;
                    }
                    dataTable.Rows.Add(dataRow);
                }
            }
        }

        public DataTable GetWorksheetData()
        {
            return dataTable;
        }
    }
}

그러면 이렇게 소스가 변경이 됩니다. 

 

4. DataGridView에 데이터 출력

이전 글에서 만들었던 UI를 계속해서 활용하도록 하겠습니다.

Windows Forms 애플리케이션에서 파일 열기 대화 상자를 사용하여 Excel 파일을 선택하고, ExcelEPPlusReader 클래스를 사용하여 데이터를 읽은 후 DataGridView에 표시합니다.

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "Excel files (*.xlsx)|*.xlsx";

    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        ExcelEPPlusReader excelReader = new ExcelEPPlusReader(openFileDialog.FileName);
        DataTable dataTable = excelReader.GetWorksheetData();

        DataGridView dataGridView = new DataGridView();
        dataGridView.DataSource = dataTable;
        dataGridView.Dock = DockStyle.Fill;

        Form form = new Form();
        form.Controls.Add(dataGridView);
        form.ShowDialog();
    }
}

 

클래스를 호출해서 엑셀 값을 저장한 다음 새로운 폼을 만들고 그 폼안에 dataGridView 를 만들어서 새창으로 넣어주면 됩니다.

 
그러면 위와 같이 엑셀을 데이터그리드뷰로 출력 할 수 있습니다. 

 

결론

EPPlus 라이브러리를 사용하면 C#에서 Excel 파일을 쉽게 읽고 데이터를 DataGridView에 출력할 수 있습니다. 이 방법은 Excel이 설치되지 않은 환경에서도 사용 가능하며, 특히 서버 환경이나 경량 애플리케이션에 적합합니다. EPPlus를 통해 C# 개발자들은 Excel 데이터를 더욱 유연하게 활용할 수 있습니다.