すべて
ファイルがダウンロードされていることをユーザーが確認できるようにファイルをダウンロードするにはどうすればよいですか(ストリームのように?)
現在ClosedXMLを使用していますが、SaveAsメソッドを使用する場合、ハードコードされたURLを指定する必要があり、ファイル名を指定するだけではダウンロードフォルダーに自動的にダウンロードされません。
以下の方法はうまく機能しますが、HTMLに基づく独自のExcelファイルを作成する必要があり、ファイルは必要以上に大きくなります。ClosedXMLを使用すると、ファイルはサイズの50%以下になります以下のコード:ただし、ダウンロードの動作は私が望むとおりです。
以下のコードを変換して、「ワークブック」をオブジェクトとして提供し、このワークブックをダウンロードする方法はありますか?
HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls");
HttpContext.Current.Response.Charset ="UTF-8";
HttpContext.Current.Response.ContentEncoding=System.Text.Encoding.Default;
HttpContext.Current.Response.ContentType = "application/ms-Excel";
ctl.Page.EnableViewState =false;
System.IO.StringWriter tw = new System.IO.StringWriter() ;
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
ctl.RenderControl(hw);
HttpContext.Current.Response.Write(tw.ToString());
HttpContext.Current.Response.End();
ありがとう
SaveAs()
メソッドはストリームをサポートしているため、ClosedXmlブックを使用するストリームとして取得するには:
public Stream GetStream(XLWorkbook excelWorkbook)
{
Stream fs = new MemoryStream();
excelWorkbook.SaveAs(fs);
fs.Position = 0;
return fs;
}
そして、ファイルをダウンロードするために:
string myName = Server.UrlEncode(ReportName + "_" + DateTime.Now.ToShortDateString() + ".xlsx");
MemoryStream stream = GetStream(ExcelWorkbook);
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=" + myName);
Response.ContentType = "application/vnd.ms-Excel";
Response.BinaryWrite(stream.ToArray());
Response.End();
古いスレッドでしたが、受け入れられたソリューションを正しく機能させることができませんでした。いくつかの検索がこれを思い付きました。
// Create the workbook
XLWorkbook workbook = new XLWorkbook();
workbook.Worksheets.Add("Sample").Cell(1, 1).SetValue("Hello World");
// Prepare the response
HttpResponse httpResponse = Response;
httpResponse.Clear();
httpResponse.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
httpResponse.AddHeader("content-disposition", "attachment;filename=\"HelloWorld.xlsx\"");
// Flush the workbook to the Response.OutputStream
using (MemoryStream memoryStream = new MemoryStream())
{
workbook.SaveAs(memoryStream);
memoryStream.WriteTo(httpResponse.OutputStream);
memoryStream.Close();
}
httpResponse.End();
ダウンロードはやや単純で短いため、コントローラーでの完全なアクションは次のようになります。ダウンロード部分は7〜10ではなく1行です。
public ActionResult XLSX()
{
System.IO.Stream spreadsheetStream = new System.IO.MemoryStream();
XLWorkbook workbook = new XLWorkbook();
IXLWorksheet worksheet = workbook.Worksheets.Add("example");
worksheet.Cell(1, 1).SetValue("example");
workbook.SaveAs(spreadsheetStream);
spreadsheetStream.Position = 0;
return new FileStreamResult(spreadsheetStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = "example.xlsx" };
}
Asp.Net MVCを使用している場合、基本的には同じですが、少しすっきりしています(そうですね:))。
public ActionResult DownloadFile(XXXModel model)
{
using (var workbook = new XLWorkbook(XLEventTracking.Disabled))
{
// create worksheets etc..
// return
using (var stream = new MemoryStream())
{
workbook.SaveAs(stream);
stream.Flush();
return new FileContentResult(stream.ToArray(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = "XXXName.xlsx"
};
}
}
public ActionResult SendFile()
{
// Create the workbook
XLWorkbook workbook = new XLWorkbook();
workbook.Worksheets.Add("Sample").Cell(1, 1).SetValue("Hello World");
// Send the file
MemoryStream excelStream = new MemoryStream();
workbook.SaveAs(excelStream);
excelStream.Position = 0;
return File(excelStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MyFileName.xlsx");
}