web-dev-qa-db-ja.com

ClosedXMLでファイルをダウンロードする

すべて

ファイルがダウンロードされていることをユーザーが確認できるようにファイルをダウンロードするにはどうすればよいですか(ストリームのように?)

現在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();

ありがとう

23
Tjekkles

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();
32
Raidri

古いスレッドでしたが、受け入れられたソリューションを正しく機能させることができませんでした。いくつかの検索がこれを思い付きました。

        // 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();
13
Stanton

ダウンロードはやや単純で短いため、コントローラーでの完全なアクションは次のようになります。ダウンロード部分は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" };
}
6
outofmind

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"
                   };
        }
    }
0
Phil
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");
}
0
rmonfort