전산직으로 살아남기

C# - Excel Mapper 사용하기 본문

Development/C#

C# - Excel Mapper 사용하기

케이마 2024. 4. 18. 14:20
728x90
반응형

1. Excel Mapper란?

Nuget에 있는 Excel Mapper 패키지를 사용하면 Excel 문서를 작성하거나 읽을 수 있습니다.

 

2. Excel Mapper 설치하기

Visual Studio 실행 → Tools → NuGet Package Manager → Manage NuGet Packages for Solution → ExcelMapper 설치

 Excel Mapper 설치 Excel Mapper 설치
 Excel Mapper 설치

 

3. Excel 파일 저장하는 방법

DB Table에서 데이터를 불러와서 Excel에 저장하는 방법은 다음과 같습니다.

public static async Task excelWriteFunc(TestContext testLibrary)
{
		 //Table에 데이터를 List로 받기
		 var attendList = await testLibrary.TestTable.ToListAsync().ConfigureAwait(false);

     //Excel Mapper 생성
     var excel = new ExcelMapper();

     List<TestModel> testModels = new();
		
     //Table에서 불러온 데이터를 수정하여 Excel에 저장하고 싶다면
     //별도의 Class Model을 생성하여 저장해야 된다. 
     foreach (var item in attendList)
     {
         TestModel inputModel = new()
         {
             Id = item.Id + 1000,
             EmpNumber = item.EmpNumber,
             Start = item.Start,
             End = item.End,
             Type = item.Type,
             Subject = item.Subject
         };
         testModels.Add(inputModel);
     }
		
		 //메모리 스트림을 이용하여 List 데이터를 Excel로 저장
     try
     {
         using (var ms = new MemoryStream())
         {
						 //async 함수의 경우는 await을 내부에서 처리하지 않을 경우 Excel 파일 저장 시 
             //손상된 파일로 저장될 수 있으므로 꼭 await을 추가해야 된다.
             await excel.SaveAsync(ms, testModels, "TestSheet");

             var fs = System.IO.File.OpenWrite(excelFile);

             await fs.WriteAsync(ms.ToArray());

             await fs.FlushAsync();

             await fs.DisposeAsync();
         }
      }
      catch (Exception)
      {
          //파일이 이미 열려있는 경우
      }
 }

 

Excel 저장 시 포멧을 지정해주기 위한 Class Model은 아래와 같습니다.

(Excel Mapper 패키지는 아래와 같이 각 항목별로 포맷을 지정하도록 권고하고 있습니다. 사용자 지정 특정 조건도 설정이 가능합니다.)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ganss.Excel;

namespace Test.Model
{
    public class TestModel
    {                
        public long Id { get; set; }
        public String EmpNumber { get; set; }             
        [DataFormat("yyyy-MM-dd")]
        public DateTime Start { get; set; }
        public DateTime End { get; set; }
        [Ganss.Excel.DataFormat("[Red][<=3];[Blue][>=4]")]
        public int Type { get; set; }
        public String Subject { get; set; }        

    }
}

 

async 함수에서 await을 세팅하지 않고 Excel File을 저장한 경우 다음과 같은 팝업이 엑셀 실행 시 발생합니다.

오류 팝업
오류 팝업

 

4. Excel 파일 읽는 방법

Excel 파일의 특정 헤더를 지정하여 읽을 수 있으며 데이터를 읽는 범위 또한 지정이 가능합니다.

public static async Task excelReadFunc()
{
      try
      {
           //HeaderRowNumber -> 헤더 번호를 지정(default = 0)
           //MinRowNumber -> 데이터 시작지점을 지정(defalut = 0)
           //MaxRowNumber -> 데이터 종료지점을 지정(default = int.MaxValue)
           var excelData = new ExcelMapper(excelFile) { HeaderRowNumber = 2, MinRowNumber = 3, MaxRowNumber = 50 }.Fetch<TestModel>();

           foreach (var item in excelData)
           {
                Console.WriteLine(item.Id + " | " + item.EmpNumber + " | " + item.Start + " | " + item.End + " | "
                    + item.Type + " | " + item.Subject);
           }
       }
       catch (Exception)
       {
           throw;
       }
}

 

다만 특정 헤더만 읽고 싶은 경우에는 별도로 Model을 생성하여 읽어야 됩니다.

public static async Task excelReadFunc2()
{
      try
      {               
           var excelData = new ExcelMapper(excelFile) { HeaderRowNumber = 2, MinRowNumber = 3, MaxRowNumber = 50 }.Fetch<TestModel2>();

           foreach (var item in excelData)
           {
                Console.WriteLine(item.Id + " | " + item.EmpNumber + " | " + item.Start + " | " + item.Type + " | ");
           }
       }
       catch (Exception)
       {
            throw;
       }
}
728x90
반응형