ASP.NET MVC で Excel ファイルを出力

Open XML SDK を使えば C#Excel ファイル (.xlsx) を出力できた。

tnakamura.hatenablog.com

先日のサンプルではファイルに出力したけど、 SpreadsheetDocument はストリームへの出力にも対応している。

今度は Excel ファイルをダウンロードできる ASP.NET MVC サンプルを書いてみた。 レポートを Excel ファイルでダウンロードする機能が実現できそうだ。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.IO;

namespace MvcExcelSample.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Excel()
        {
            byte[] fileContents;

            // 出力先はストリーム
            using (var stream = new MemoryStream())
            {
                // スプレッドシートドキュメントを作成
                var document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook);

                // WorkbookPart をドキュメントに追加
                var workbookPart = document.AddWorkbookPart();
                workbookPart.Workbook = new Workbook();

                // WorksheetPart を WorkbookPart に追加
                var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
                var sheetData = new SheetData();
                worksheetPart.Worksheet = new Worksheet(sheetData);

                // Sheets をワークブックに追加
                var sheets = workbookPart.Workbook.AppendChild(new Sheets());

                // ワークシートをワークブックに追加
                var sheet = new Sheet()
                {
                    Id = workbookPart.GetIdOfPart(worksheetPart),
                    SheetId = 1,
                    Name = "Sample",
                };
                sheets.Append(sheet);

                // sheetData に行を追加
                var row1 = new Row();
                row1.Append(new Cell()
                {
                    DataType = CellValues.String,
                    CellValue = new CellValue("A1 のセル"),
                });
                sheetData.Append(row1);

                var row2 = new Row();
                row2.Append(new Cell()
                {
                    DataType = CellValues.String,
                    CellValue = new CellValue("A2 のセル"),
                });
                sheetData.Append(row2);

                // ワークブックを保存
                worksheetPart.Worksheet.Save();

                // ドキュメントを閉じる
                document.Close();

                fileContents = stream.ToArray();
            }

            return File(fileContents,
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                "sample.xlsx");
        }
    }
}