C# 从ASPX页面创建和下载Excel文件

C# 从ASPX页面创建和下载Excel文件,c#,asp.net,excel,C#,Asp.net,Excel,我需要创建和excel文件,并从aspx页面下载它。我创建了一个简单的页面default.aspx,上面有一个按钮Button1。这里是default.aspx.cs文件 using System; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1

我需要创建和excel文件,并从aspx页面下载它。我创建了一个简单的页面default.aspx,上面有一个按钮Button1。这里是default.aspx.cs文件

using System;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        string content = "";
        content += "<head>";
        content += "</head>";
        content += "<body>";
        content += "<table>";
        content += "<tr>";
        content += "<th>foo</th>";
        content += "</tr>";
        content += "</table>";
        content += "</body>";
        content += "</html>";
        Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
        Response.AppendHeader("Content-disposition", "attachment; filename=test.xls");
        Response.Write(content);
    }
}
当我运行此代码并单击按钮时,它实际上会在单元格A1中生成带有测试foo的Excel文件。问题是我从IE收到以下错误消息:


我做错了什么?如何生成文件以使其不会导致显示错误消息?

您不能隐式创建Excel文件作为HTTP响应。您基本上有两种选择:

以Excel可以读取的格式创建响应,例如逗号分隔的CV。 使用服务器端API以编程方式创建Excel文件并将其作为附件发送回。 如果选择第一个选项,当文件在Excel中打开时,您将继续获得此弹出窗口。但是,该文件将在Excel中打开

第二种选择可能会让你花钱。我曾为一家名为SoftArtisans的公司工作,该公司编写了一个名为ExcelWriter的API,可以满足您的需要:

他们的主要竞争对手是Aspose,其产品名为Aspose.Cells。我没有亲自使用过,但他们有自己的忠实客户,因此我认为该产品很好:


HTML不是Excel工作簿

当Excel打开文件时,它不考虑或信任文件扩展名,因为它可以由用户任意更改——而是打开任何文件并查找某些模式,例如Excel 2007 + OOXML文件以字符PK开头。CSV文件每隔一段时间有逗号,旧的Excel文件有自己的二进制格式和神奇的单词等

在您的例子中,Excel正在打开文件,将其检测为HTML,并将其作为HTML表读取,然后将其转换为电子表格。您的代码实际上并没有发送真正的Excel工作簿-因此您的MIME类型完全不正确


如果你想要的东西总是能正常工作,我建议让用户下载CSV格式的数据,这样做的好处是跨平台,可以在Microsoft Excel、Apple数字、OpenOffice Calc和良好的ol记事本中打开。确保将其作为文本/csv提供。

应为application/vnd.ms-excel,而不是application/vmd.ms-excel vmd->vndmax,是的,您是正确的。然而,这并不能解决问题。我正在更新代码以反映此更正。如果这是一个重复的问题,请提供一个链接,指向此问题的答案?被认为是重复的链接问题并没有询问我如何生成该文件,以便它不会导致显示错误消息?更重要的是,这并没有回答这个问题。这里有一篇文章声称这是可以做到的,但它缺少一个工作样本。或者使用/学习极其自由的,我不反对这个建议,特别是如果它是一个简单的工作簿。但是,如果您想编写xls文件格式,这不是一个选项。对于未来的读者,以上建议避免使用Office Interop。从ASP.NET或其他服务器技术使用Office互操作是一个可怕的想法。这些API是为在桌面应用程序中使用而编写的,用于自动化Office一套桌面应用程序。服务器应用程序在许多方面都不同,因此在其中使用Office互操作是一个非常非常糟糕的主意。它也不受Microsoft支持,可能会违反您的Office许可证。参见@maniak1982为什么这不是一个选项?我已经用SDK在幕后编写了许多excel文档。当然,它使用较新的.xlsx文件格式,但这并不意味着它不能完成。OOXML SDK很好。使用Office互操作的自动化基于上述原因,在Office中编写VBA宏时使用的API不是。