web-dev-qa-db-fra.com

Télécharger le fichier avec ClosedXML

Tout

Comment puis-je télécharger un fichier pour que l'utilisateur voie le téléchargement (comme avec un flux?)

J'utilise actuellement ClosedXML, mais si j'utilise la méthode SaveAs, je dois donner une URL codée en dur, et si je ne donne que le nom du fichier, il ne se télécharge pas automatiquement dans le dossier de téléchargement.

La méthode ci-dessous fonctionne très bien, mais je dois créer mon propre fichier Excel, basé sur HTML, et le fichier grossit de façon beaucoup trop volumineuse, alors que, lorsque j'utilise ClosedXML, le fichier ne contient que 50% ou moins de la code ci-dessous: Cependant, le comportement de téléchargement correspond à ce que je souhaiterais.

Existe-t-il un moyen de convertir le code ci-dessous pour pouvoir donner mon "classeur" en tant qu'objet, et le téléchargement de ce classeur se fait simplement?

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

Merci

19
Tjekkles

La méthode SaveAs() prend en charge le flux. Pour obtenir le classeur ClosedXml en tant que flux, j’utilise:

public Stream GetStream(XLWorkbook excelWorkbook)
{
    Stream fs = new MemoryStream();
    excelWorkbook.SaveAs(fs);
    fs.Position = 0;
    return fs;
}

Et puis pour télécharger le fichier:

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

Vieux fil, mais je ne parvenais pas à faire fonctionner correctement la solution acceptée. Cela a donné lieu à quelques recherches plus poussées, ce qui a parfaitement fonctionné pour moi:

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

Le téléchargement peut être un peu plus simple et plus court, l’action complète dans votre contrôleur pourrait alors ressembler à ceci: la partie téléchargement n’est qu’une ligne au lieu de sept à dix

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" };
}
5
outofmind

Si vous utilisez Asp.Net MVC, fondamentalement le même mais légèrement plus propre (enfin je pense que oui :)).

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