EPPlus로 엑셀파일 작성

EPPlus로 엑셀파일 작성

ASP.NET 기반의 업무용 웹 어플에서 엑셀 출력 기능을 개발하면서 찾아본 내용등을 간단히 정리한 내용입니다

using OfficeOpenXml;
using OfficeOpenXml.Style;

  /// <summary>
  /// Model 데이터를 기반으로 Excel 작성
  /// </summary>
  /// <param name="excelModel"></param>
  /// <returns>byte[]</returns>
  public byte[] MakeDetailsAsExcel(ContractExcelModel excelModel)
  {
      using (var package = new ExcelPackage())
      {
          var worksheet = package.Workbook.Worksheets.Add("Sheet1");
          worksheet.Column(1).Width = 3;
          var allRangeHeight = 500;

          // worksheet.Column(2)からworksheet.Column(32)까지 같은 폭을 설정
          for (int i = 2; i <= 32; i++)
          {
              worksheet.Column(i).Width = 3.9;
          }

          for (int i = 1; i <= allRangeHeight; i++)
          {
              worksheet.Row(i).Height = 11.25;
          }

          // 현재의 행 위치. 기본적으로 해당 행의 처리를 끝냄과 동시에 개행(+1)한다(currentRow++). 처리가 복잡한 경우엔 마지막에 개행한 만큼의 행 숫자를 더한다.
          int currentRow = 1;
          int headBlockRow = 1;

          var lightGrayColor = Color.FromArgb(242, 242, 242);
          var grayColor = Color.FromArgb(217, 217, 217);

          var allRange = worksheet.Cells[1, 1, allRangeHeight, 32];
          allRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
          allRange.Style.Fill.BackgroundColor.SetColor(System.Drawing.ColorTranslator.FromHtml("#FFFFFF"));
          allRange.Style.Font.Name = "Gulim";
          allRange.Style.Font.Size = 9;
          allRange.Style.VerticalAlignment = ExcelVerticalAlignment.Center;

          var listData = new ExcelListDefaultModel();
          // 데이터의 설정한 다음엔 현재의 행 수에 +1을 한다
          currentRow++;

          headBlockRow = currentRow;
          var infoRange = worksheet.Cells["B" + currentRow + ":L" + (currentRow + 5)];
          infoRange.Style.Border.BorderAround(ExcelBorderStyle.Thin);
          worksheet.Cells["B" + currentRow++].Value = excelModel.Name;
          currentRow++;

          // Model의 값을 엑셀에 기입

          #region 마지막에 출력 범위 지정(인쇄 범위를 지정하고 싶을 경우)
          worksheet.PrinterSettings.PrintArea = worksheet.Cells["A1:AF" + currentRow]; // 인쇄 범위(전체)
          worksheet.View.PageBreakView = true; // Page Break Preview
          worksheet.View.ZoomScale = 100; // 줌 설정
          worksheet.PrinterSettings.FitToPage = true; // 인쇄설정. 모든 열을 1페이지 내에 인쇄
          worksheet.PrinterSettings.PaperSize = ePaperSize.A4; // 용지 사이즈
          worksheet.PrinterSettings.FitToHeight = 0; // 용지 사이즈 조절(세로)
          worksheet.PrinterSettings.FitToWidth = 1; // 용지 사이즈 조절(가로)
		  // Footer설정. 페이지 표시
          worksheet.HeaderFooter.OddFooter.RightAlignedText = String.Format("{0} / {1}", ExcelHeaderFooter.PageNumber, ExcelHeaderFooter.NumberOfPages);
          #endregion

		  // 값의 길이에 맞게 열의 폭을 조절
          worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();

          return package.GetAsByteArray();
      }
  }

Stream을 파일로 보존하고 싶을 경우엔 아래와 같이 사용합니다.

var path = "C:\test.xlsx";
File.WriteAllBytes(path, package.GetAsByteArray());

Pie's Tech Note

생계형 개발자의 메모장

comments powered by Disqus

    rss facebook twitter github youtube mail spotify instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora