xlworkbook - crear archivo excel c#
Descargar archivo con ClosedXML (6)
El método SaveAs()
admite la transmisión, por lo que para obtener el libro ClosedXml como una transmisión que uso:
public Stream GetStream(XLWorkbook excelWorkbook)
{
Stream fs = new MemoryStream();
excelWorkbook.SaveAs(fs);
fs.Position = 0;
return fs;
}
Y luego para descargar el archivo:
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();
Todos
¿Cómo puedo descargar un archivo para que el usuario vea que se está descargando (como en una transmisión)?
Actualmente estoy usando ClosedXML, pero si uso el método SaveAs, tengo que proporcionar una URL codificada, y si solo doy el nombre del archivo, no se descarga automáticamente a la carpeta de descarga.
El siguiente método funciona muy bien, pero tengo que crear mi propio archivo de Excel, que se basa en HTML, y el archivo crece mucho más de lo que debería, cuando uso ClosedXML, el archivo solo tiene un 50% o menos del tamaño del archivo. Código abajo: Sin embargo, el comportamiento de descarga es como me gustaría que fuera.
¿Hay alguna manera de convertir el código a continuación para que pueda dar mi "libro de trabajo" como un objeto, y simplemente lo descargue?
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();
Gracias
La descarga se puede hacer de una manera más simple y más corta, por lo que la acción completa en su controlador podría verse así: la parte de descarga es solo una línea en lugar de siete a diez.
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 utilizo Asp.Net MVC, básicamente lo mismo pero un poco más ordenado (bueno, creo que sí :)).
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"
};
}
}
Tema antiguo, pero no conseguí que la solución aceptada funcionara bien. Se me ocurrió algo más de búsqueda, lo que funcionó muy bien para mí:
// 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();
//Method for Export Excel using Closed Xml
public void ExportDataWithClosedXml_Method(DataTable table, string tabName, string fileType)
{
var workbook = new XLWorkbook();
var ws = workbook.Worksheets.Add(table, tabName);
int row = 2 + table.Rows.Count;
int col = table.Columns.Count;
var redRow = ws.Row(1);
//redRow.Style.Fill.BackgroundColor = XLColor.Red;
redRow.InsertRowsAbove(1);
ws.Cell(1, 1).Value = "Name of Report Type";
ws.Cell(1, 1).Style.Font.Bold = true;
ws.Table(0).ShowAutoFilter = false;
//ws.Row(2).Style.Fill.BackgroundColor = XLColor.Red;
ws.Range(2, 1, 2, col).Style.Fill.BackgroundColor = XLColor.Green;
ws.Range(2, 1, 2, col).Style.Font.Bold = true;
ws.Range(3, 1, row, col).Style.Font.Italic = true;
HttpContext.Current.Response.Clear();
using (MemoryStream memoryStream = new MemoryStream())
{
workbook.SaveAs(memoryStream);
memoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
memoryStream.Close();
}
if (fileType == "xlsx")
{
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=/"Samplefile.xlsx/"");
}
else
{
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=/"Samplefile.xls/"");
}
HttpContext.Current.Response.End();
}
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");
}