我正在构建一个asp.net网站,我正在构建一个基于某些gridview数据的Excel文档。我正在使用Microsoft.Office.Interop.Excel
来构建它。我尝试使用saveFileDialog
使用System.Windows.Forms
框。通过我的在线研究,我了解到你无法在asp.net应用程序中实际执行此操作?在调试模式下一切都很好,但是当它上传到站点时,页面根本不起作用。所以我的问题是,是否可以在asp.net应用程序中使用saveFileDialog
框?有谁知道一个很好的解决方法吗?我将发布在调试模式下运行良好的代码,但在将其上传到我的站点时不起作用。提前感谢您的帮助。
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();
}
}
答案 0 :(得分:2)
使用保存对话框无法执行所需操作。您应该只将文件保存到服务器上的临时位置。将文件保存到某处后,可以强制用户下载文件。我通常遵循这个代码(似乎最一致地在所有浏览器中工作)。您必须提供filename
和yourFileByteArray
变量。
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();
有几种方法可以将您的文件作为字节数组,但我会将其作为练习留给您。
答案 1 :(得分:1)
不要使用Interop。建议混合使用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();
}
答案 2 :(得分:0)
您无法在服务器上显示对话框。那里没有人可以看到它。摆脱整个saveFileDialog对象,只需在服务器的文件系统中使用生成的文件名调用SaveAs,该文件系统保证是唯一的。然后将该文件传输给您的用户。