能够生成Excel报表并将其推送到客户端计算机,而无需将文件保存在服务器中

目前我从表中获取数据并将其转换为Excel工作簿,然后将其保存在服务器空间中,然后使用Response类将文件推送到客户机。 代码工作正常。 但我有一个想法,不存储在物理存储的文件,因为它增加了服务器存储,并直接推送到客户端机器。 请以任何方式提供build议。 提前致谢。

protected void GenerateExcelFile() { string data = null; int i = 0; int j = 0; Application xlApp; Workbook xlWorkBook; Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; xlApp = new Application(); xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(1); DataSet ds = new DataSet(); ds = GetTableData();// Returns dataset for (int k = 0; k < ds.Tables[0].Columns.Count; k++) { xlWorkSheet.Cells[1, k + 1] = ds.Tables[0].Columns[k].ColumnName; } for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) { for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) { data = ds.Tables[0].Rows[i].ItemArray[j].ToString(); xlWorkSheet.Cells[i + 2, j + 1] = data; } } xlWorkBook.SaveAs("c:\\csharp.net-informations.xls", XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); string FileName = "Report.xls"; string filepath = "c:\\csharp.net-informations.xls"; WebClient req = new WebClient(); HttpResponse response = HttpContext.Current.Response; FileInfo file = new FileInfo(filepath); response.Clear(); response.ClearContent(); response.ClearHeaders(); response.Buffer = true; Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName); Response.AddHeader("Content-Length", file.Length.ToString()); Response.ContentType = ReturnExtension(file.Extension.ToLower()); Response.TransmitFile(file.FullName); response.End(); 

我用这个,直接在客户端PC下载excel

  System.IO.StringWriter objStringWriter1 = new System.IO.StringWriter(); System.Web.UI.WebControls.GridView gridView1 = new System.Web.UI.WebControls.GridView(); System.Web.UI.HtmlTextWriter objHtmlTextWriter1 = new System.Web.UI.HtmlTextWriter(objStringWriter1); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; HttpContext.Current.Response.Charset = ""; HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName); gridView1.DataSource = tempDataTable; gridView1.DataBind(); gridView1.RenderControl(objHtmlTextWriter1); gridView1.Dispose(); HttpContext.Current.Response.Write(objStringWriter1.ToString()); HttpContext.Current.Response.End(); 

如果你正在创build服务器端的Excel工作表,那么你必须保存它,然后再发送给客户端。

如果你不想保存在服务器上,那么你可以简单地发送列表格式的响应,然后你可以在客户端创buildExcel表。 在Javascript中创buildExcel工作表

使用OOXML库而不是Microsoft.Office.Interop.Excel。 该库包称为EPPlus。 这是你如何在你的项目中设置的:

  1. 在Visual Studio的包pipe理器控制台中,input:Install-Package EPPlus(这将根据需要安装库和参考)
  2. 将此使用语句( using OfficeOpenXml; )添加到您的代码

以下是使用OOXML库的一些示例代码。 您将需要创build一个ExcelPackage:

  ExcelPackage pck = new ExcelPackage(); ExcelWorksheet ws = pck.Workbook.Worksheets.Add("exported data"); // Excel sheet headings ws.Cells[1, 1].Value = "Column 1 title"; ws.Cells[1, 2].Value = "Column 2 title"; 

现在使用下面的代码将excel文件保存在客户端上:

  Byte[] fileBytes = pck.GetAsByteArray(); // convert excel data to bytes Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=\"fileName1.xlsx\""); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AppendHeader("Content-Length", fileBytes.Length.ToString()); Response.BinaryWrite(fileBytes); Response.End();