所有
如何下载文件以便用户看到它正在下载(如使用流?)
我目前正在使用ClosedXML,但如果我使用SaveAs方法,我必须提供一个硬编码的URL,如果我只是给它文件名,它不会自动下载到下载文件夹。
下面的方法效果很好,但我必须创建自己的excel文件,该文件基于HTML,并且文件增长得太大,当我使用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();
下载可以更简单,更短,因此控制器中的完整操作可能如下所示 - 下载部分只有一行而不是七行到十行
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" };
}
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");
}
如果使用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"
};
}
}
//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();
}