私は以下のコードを使用してasp.net mvcでExcelにデータをエクスポートしていました
Response.AppendHeader("content-disposition", "attachment;filename=ExportedHtml.xls");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.ms-Excel";
this.EnableViewState = false;
Response.Write(ExportDiv.InnerHtml);
Response.End();
このコードを実行すると、ファイルが作成され、保存する場所が要求されます
NPOIで作業して、Excelファイルを非常にうまく作成しようとしましたが、クライアントの場所にファイルを保存できません。
上記のコードをasp.netコア2.0で動作させる方法や、クライアントマシンでExcel形式でデータを保存できる他の方法はありますか?
それを達成する方法はたくさんあります。
Excelを生成して、wwwroot
フォルダーに保存できます。そして、それをページ上の静的コンテンツとして提供できます。
たとえば、wwwroot
フォルダー内に 'temp'というフォルダーがあり、新しく生成されたすべてのExcelが含まれています。
<a href="\temp\development\user1\2018\5\9\Excel1.xlsx" download>Download</a>
このアプローチには制限があります。それらの1つは、新しいdownload
属性です。最新のブラウザでのみ機能します。
別の方法は、Excelを生成し、バイト配列に変換してコントローラーに送り返すことです。そのために、.Net Core 2.0をサポートする「EPPlus」(v:4.5.1)というライブラリを使用します。
以下は、アイデアを提供するためにまとめたサンプルコードの一部です。生産準備ができていません。
using OfficeOpenXml;
using OfficeOpenXml.Style;
namespace DL.SO.Web.UI.Controllers
{
public class ExcelController : Controller
{
public IActionResult Download()
{
byte[] fileContents;
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
// Put whatever you want here in the sheet
// For example, for cell on row1 col1
worksheet.Cells[1, 1].Value = "Long text";
worksheet.Cells[1, 1].Style.Font.Size = 12;
worksheet.Cells[1, 1].Style.Font.Bold = true;
worksheet.Cells[1, 1].Style.Border.Top.Style = ExcelBorderStyle.Hair;
// So many things you can try but you got the idea.
// Finally when you're done, export it to byte array.
fileContents = package.GetAsByteArray();
}
if (fileContents == null || fileContents.Length == 0)
{
return NotFound();
}
return File(
fileContents: fileContents,
contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
fileDownloadName: "test.xlsx"
);
}
}
}
David Liangの答えに同意しました。
DataTable全体をエクスポートする場合は、変更をスライドします。
string export="export";
DataTable dt = new DataTable();
//Fill datatable
dt = *something*
byte[] fileContents;
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add(export);
worksheet.Cells["A1"].LoadFromDataTable(dt, true);
fileContents = package.GetAsByteArray();
}
if (fileContents == null || fileContents.Length == 0)
{
return NotFound();
}
return File(
fileContents: fileContents,
contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
fileDownloadName: export + ".xlsx"
);
これに対する解決策は次のとおりです。
using OfficeOpenXml;
public class XmlService
{
// [...]
public void getXlsxFile(SomeTableObject tbl, ref byte[] bytes)
{
using (ExcelPackage pck = new ExcelPackage())
{
ExcelWorksheet ws = pck.Workbook.Worksheets.Add(tbl.name);
ws.Cells["A1"].LoadFromDataTable(tbl, true);
bytes = pck.GetAsByteArray();
}
}
}
EPPlusの詳細については、 here を参照してください。上記のソースコードは our open source repo(GPL) にあります。