NPOIを採用しています。
コード例
public ActionResult ExcelExp()
{
ExcelExporter excelExporter = new ExcelExporter();
// エクスポート処理
using (var stream = new MemoryStream())
{//※ストリームが自動的に閉じられ、リソースが解放されるため、手動で Close や Dispose を呼び出す必要はなし
// テンプレートに基づいてエクスポート内容を作成
string templatePath = Server.MapPath(ConfigurationManager.AppSettings["ExpTemp"]);
excelExporter.ExportToStream(stream, templatePath);
// MemoryStreamをバイト配列に変換
byte[] fileBytes = stream.ToArray();
// ダウンロード用にファイルを返す
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "exportedFile.xlsx");
}
}
public class ExcelExporter
{
public void ExportToStream(MemoryStream stream, string templatePath)
{
// テンプレートファイルを読み込む
using (var fileStream = new FileStream(templatePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = new XSSFWorkbook(fileStream);
ISheet sheet = workbook.GetSheetAt(0);
// セルにデータを挿入
IRow row = sheet.GetRow(1) ?? sheet.CreateRow(1);
ICell cell = row.GetCell(1) ?? row.CreateCell(1);
cell.SetCellValue("Sample Data");
// スタイルのカスタマイズ
ICellStyle style = workbook.CreateCellStyle();
IFont font = workbook.CreateFont();
font.FontHeightInPoints = 12;
font.FontName = "Arial";
font.IsBold = true;
style.SetFont(font);
style.FillForegroundColor = IndexedColors.LightYellow.Index;
style.FillPattern = FillPattern.SolidForeground;
cell.CellStyle = style;
// メモリストリームに書き込み
workbook.Write(stream, true);//★★★★★
// ストリームの位置を先頭に戻す
stream.Position = 0;//★★★★★
}
}
}
ポイント
-
★★★★★
は要注意:
-workbook.Writeの実行にstreamを自動的に閉じないようにしておいてください