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