如何从你的asp.net应用程序下载生成的excel文件

我正在build立一个asp.net网站,我正在构build基于一些gridview数据的Excel文档。 我正在使用Microsoft.Office.Interop.Excel来构build它。 我试图使用System.Windows.Forms saveFileDialog框。 通过我的在线研究,我已经了解到,你实际上不能在asp.net应用程序中做到这一点? 在debugging模式下一切都很好,但是当它上传到网站时,页面根本不起作用。 所以我的男人的问题是,是否有可能使用一个asp.net应用程序的saveFileDialog框? 有没有人知道一个很好的解决方法呢? 我会发布我的代码,在debugging模式下效果很好,但是当我上传到我的网站时不起作用。 在此先感谢您的帮助。

 using System.Threading; using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Office.Interop.Excel; using System.Windows.Forms; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); Excel.Application xlApp = new Excel.Application(); Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; public void someEvent() { var t = new Thread(SaveFolder); t.IsBackground = true; t.SetApartmentState(ApartmentState.STA); t.Start(); } public void SaveFolder() { saveFileDialog1.Filter = "Sources (*.xls, *.xlsx)|*.xls*;*.xlsx"; saveFileDialog1.ShowDialog(); exportReport(); } public void exportReport() { xlWorkBook.SaveAs(@saveFileDialog1.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlApp); releaseObject(xlWorkBook); releaseObject(xlWorkSheet); } public void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Unable to release the Object " + ex.ToString()); } finally { GC.Collect(); } } 

您无法在服务器上显示对话框。 没有人在那里看到它。 摆脱整个saveFileDialog对象,只需在服务器的文件系统中使用生成的文件名调用SaveAs(保证为唯一)即可。 然后将该文件传输给您的用户。

你不能用保存对话框做你想做的事。 您应该将文件保存到服务器上的临时位置。 一旦将文件保存在某个地方,您可以强制用户下载文件。 我通常遵循这个代码(似乎在所有浏览器中工作最一致)。 你必须提供filenameyourFileByteArrayvariables。

 Response.Buffer = true; Response.Clear(); Response.ClearHeaders(); Response.ContentType = "application/vnd.ms-excel"; Response.CacheControl = "public"; Response.AddHeader("Pragma", "public"); Response.AddHeader("Expires", "0"); Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); Response.AddHeader("Content-Description", "Excel File Download"); Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); Response.BinaryWrite(yourFileByteArray); Response.Flush(); Response.End(); 

有几种方法可以将文件作为一个字节数组,但我将把它作为一个练习。

不要使用Interop。 build议使用HtmlTextWriter,StringWriter和GridView的组合。

 public void GridViewToExcel() { Response.Clear(); Response.AddHeader("content-disposition", "attachment;filename=MyFile.xls"); Response.Charset = ""; Response.ContentType = "application/vnd.xls"; var writer = new System.IO.StringWriter(); var htmlWriter = new HtmlTextWriter(writer); GridView1.RenderControl(htmlWriter); Response.Write(writer.ToString()); Response.End(); }