【问题标题】:How to download a generated excel file from your asp.net application如何从您的 asp.net 应用程序下载生成的 excel 文件
【发布时间】:2011-11-01 22:20:53
【问题描述】:

我正在构建一个 asp.net 网站,并且正在构建一个基于一些 gridview 数据的 Excel 文档。我正在使用Microsoft.Office.Interop.Excel 来构建它。我尝试使用saveFileDialog 框使用System.Windows.Forms。通过我的在线研究,我了解到您实际上不能在 asp.net 应用程序中执行此操作?在调试模式下一切正常,但在将其上传到站点时,页面根本不起作用。所以我的问题是,是否可以将saveFileDialog 框用于 asp.net 应用程序?有谁知道一个好的解决方法?我将发布在调试模式下运行良好的代码,但在我将其上传到我的站点时却无法运行。提前感谢您的帮助。

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();
    }
} 

【问题讨论】:

  • 它可能正在显示对话框...在您的服务器上,那里没有人可以看到它!

标签: asp.net excel export-to-excel download


【解决方案1】:

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

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();

有几种方法可以将您的文件作为字节数组获取,但我将把它留给您作为练习。

【讨论】:

  • 所以 Response.BinaryWrite() 是您强制用户下载您保存到临时位置的文件的地方?正确的?为什么你不能只使用 Response.WriteFile() 或其他东西,因为从技术上讲,文件现在存在是正确的?
  • 您对用户的文件系统没有任何控制权。用户必须选择保存文件。您能做的最好的事情就是将文件强制发送到浏览器,就像上面的代码通过响应所做的那样。浏览器和用户必须同意将文件放在某个地方。
  • 感谢您的帮助 Cory,您的解释确实让我更好地理解了需要做什么。
【解决方案2】:

不要使用互操作。建议混合使用 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();
}

【讨论】:

  • 如果你不能使用互操作,你如何按照你想要的方式格式化你的 excel 文件?
  • 要么使用 OpenXML 版本的 Excel 文件 (2007+),要么使用 Aspose 等工具。互操作 Excel 不是线程安全的,性能很差,并且需要在服务器上安装 Excel。它有效,但并不理想。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2021-11-29
    • 2012-04-03
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多