使用ClosedXML下载文件

所有

如何下载文件,以便用户看到它正在下载(如使用流?)

我目前正在使用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(); }