[C#] NPOI를 이용한 엑셀 파일 만들기


Development note/C#  2019. 5. 14. 23:25

안녕하세요. 명월입니다.

 

이번 포스팅에서는 C#에서 엑셀파일을 다루는 라이브러리 NPOI에 대해서 설명하겠습니다.

NPOI는 Apache 재단에서 만든 엑셀, 파워포인트, 워드 파일 포멧을 운영하기 위한 라이브러리로 원래는 Java에서 POI로 시작했으나 C#에서도 사용하기 위해 NPOI의 이름으로 라이브러리를 지원하고 있습니다.

NPOI에 관해서는 포스팅을 두개로 나누어서 설명할 생각인데 이번에는 엑셀을 만드는 글입니다.

 

먼저 NUGET을 통해 NPOI를 다운, 참조하겠습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
//공통 NPOI
using NPOI;
using NPOI.SS.UserModel;
//표준 xls 버젼 excel시트
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
//확장 xlsx 버젼 excel 시트
using NPOI.XSSF;
using NPOI.XSSF.UserModel;

namespace NPOIExample
{
  class Program
  {
    static void Main(string[] args)
    {
      new Program();
      Console.WriteLine("Press Any Key...");
      Console.ReadKey();
    }
    public Program()
    {
      var version = "xls";
      //var version = "xlsx";
      // Workbook 생성.
      var workbook = CreateWorkbook(version);

      // Workbook안에 시트 생성.
      var sheet = workbook.CreateSheet("Test Sheet");

      // Sheet에서 셀 취득
      var cell = GetCell(sheet, 0, 0);
      // 셀에 데이터 작성
      cell.SetCellValue("TEST Result");

      cell = GetCell(sheet, 0, 1);
      cell.SetCellValue(100);

      cell = GetCell(sheet, 0, 2);
      cell.SetCellValue(DateTime.Now);
      

      // 셀에 데이터 포멧 지정
      var style = workbook.CreateCellStyle();
      // 날짜 포멧
      style.DataFormat = HSSFDataFormat.GetBuiltinFormat("m/d/yy h:mm");
      // 정렬 포멧
      style.Alignment = HorizontalAlignment.Center;
      style.VerticalAlignment = VerticalAlignment.Top;
      // 셀 색지정
      style.FillBackgroundColor = IndexedColors.Gold.Index;
      // 폰트 설정
      var font = workbook.CreateFont();
      font.Color = IndexedColors.Red.Index;
      cell.CellStyle = style;

      //셀 너비 자동 지정
      sheet.AutoSizeColumn(0);
      sheet.AutoSizeColumn(1);
      sheet.AutoSizeColumn(2);

      cell = GetCell(sheet, 1, 0);
      cell.SetCellValue(1);

      cell = GetCell(sheet, 1, 1);
      cell.SetCellValue(2);

      cell = GetCell(sheet, 1, 2);
      //함수식
      cell.SetCellFormula("SUM(A2:B2)");

      WriteExcel(workbook, @"d:\work\test." + version);
    }
    // Workbook 생성
    public IWorkbook CreateWorkbook(string version)
    {
      //표준 xls 버젼
      if ("xls".Equals(version))
      {
        return new HSSFWorkbook();
      }
      //확장 xlsx 버젼
      else if ("xlsx".Equals(version))
      {
        return new XSSFWorkbook();
      }
      throw new NotSupportedException();
    }

    // Sheet로 부터 Row를 취득, 생성하기
    public IRow GetRow(ISheet sheet, int rownum)
    {
      var row = sheet.GetRow(rownum);
      if (row == null)
      {
        row = sheet.CreateRow(rownum);
      }
      return row;
    }
    // Row로 부터 Cell를 취득, 생성하기
    public ICell GetCell(IRow row, int cellnum)
    {
      var cell = row.GetCell(cellnum);
      if (cell == null)
      {
        cell = row.CreateCell(cellnum);
      }
      return cell;
    }
    public ICell GetCell(ISheet sheet, int rownum, int cellnum)
    {
      var row = GetRow(sheet, rownum);
      return GetCell(row, cellnum);
    }
    public void WriteExcel(IWorkbook workbook, string filepath)
    {
      using (var file = new FileStream(filepath, FileMode.Create, FileAccess.Write))
      {
        workbook.Write(file);
      }
    }
  }
}

xls버젼과 xlsx버젼은 namespace부터 다르고 다루는 클래스도 다릅니다. 그러나 다행이도 두 클래스를 하나의 IWorkbook과 ISheet의 인터페이스로 묶어놔서 처음 클래스 생성할 때만 분기를 시키고 다음은 인터페이스의 변수 타입으로 객체를 다루면 됩니다.

기본적으로 가장 많이 사용하는 데이터 입력과 함수식, 기타 색지정 스타일까지는 코딩했습니다. NPOI 인터페이스가 워낙 많아서 다 사용하기에는 무리가 있습니다.

그런데 어느 분이 자주 사용하는 POI API를 정리해 놓았네요.

 

참조: https://m.blog.naver.com/cyberop/10033530441

 

실제로 업무할 때는 엑셀을 처음부터 작성해서 사용하는 경우는 드뭅니다. 왜냐하면 NPOI 자체도 좀 무거운 라이브러리고 템플릿을 미리 만들어 놓고 읽어 드려서 값만 바꾸는 식으로 처리하는 편이 성능면에서도 효율적이기 때문입니다.

다음 포스팅에서는 엑셀을 미리 만들어 놓고 값만 바꾸어서 사용하는 방법에 대해 다루겠습니다.

 

첨부파일입니다.

NPOIExample.zip
0.29MB