読者です 読者をやめる 読者になる 読者になる

IT業界のすみっこ暮らし

ふと気がついたときの記録

EPPLUSでエクセルファイル作成

開発 C#

.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 = "MS Pゴシック";
          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;
          worksheet.View.ZoomScale = 100;
          worksheet.PrinterSettings.FitToPage = true;
          worksheet.PrinterSettings.PaperSize = ePaperSize.A4;
          worksheet.PrinterSettings.FitToHeight = 0;
          worksheet.PrinterSettings.FitToWidth = 1;
          worksheet.HeaderFooter.OddFooter.RightAlignedText = String.Format("{0} / {1}", ExcelHeaderFooter.PageNumber, ExcelHeaderFooter.NumberOfPages);
          #endregion

          return package.GetAsByteArray();
      }
  }