【问题标题】:Creating and downloading an Excel file from ASPX page [duplicate]从 ASPX 页面创建和下载 Excel 文件 [重复]
【发布时间】:2014-11-15 08:57:32
【问题描述】:

我需要创建和 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 收到以下错误消息:

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

【问题讨论】:

  • 应该是 application/vnd.ms-excel 而不是 application/vmd.ms-excel (vmd -> vnd)
  • 马克西姆,是的,你是对的。然而,这并不能解决问题。我正在更新代码以反映此更正。
  • 如果这是一个重复的问题,您能否提供一个链接到该问题的答案?据称是重复的链接问题不会询问“我如何生成文件以便它不会导致显示错误消息?”更重要的是没有回答这个问题。
  • 这里有一篇文章声称可以做到这一点c-sharpcorner.com/UploadFile/kaushikborah28/…,但它缺少工作示例。

标签: c# asp.net excel


【解决方案1】:

HTML 不是 Excel 工作簿。

当 Excel 打开文件时,它不会考虑或信任文件扩展名,因为它可以由用户任意更改 - 相反,它会打开任何文件并查找某些模式(例如,Excel 2007+ OOXML 文件以字符开头PK. CSV 文件有固定的逗号,旧的 Excel 文件有自己的二进制格式和“魔法词”等)

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

如果您想要始终“正常工作”的东西,我建议让用户下载 CSV 格式的数据,这具有跨平台并可在 Microsoft Excel、Apple Numbers、OpenOffice Calc 和良好的 ol 中打开的好处记事本。确保将其作为text/csv 提供。

【讨论】:

    【解决方案2】:

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

    1. 以 Excel 可以读取的格式创建响应,例如逗号分隔 (CVS)。
    2. 使用服务器端 API 以编程方式创建 Excel 文件并将其作为附件发回。

    如果您选择第一个选项,当文件在 Excel 中打开时,您将继续看到此弹出窗口。但是,该文件将在 Excel 中打开。

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

    http://www.officewriter.com/officewriter-free-evaluation.aspx

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

    http://www.aspose.com/docs/display/cellsnet/Aspose.Cells

    【讨论】:

    • 或使用/学习极其免费的OpenXML SDK to Generate Excel Workbooks
    • 我不同意这个建议,特别是如果它是一个简单的工作簿。但是,如果您想编写 xls 文件格式,那不是一个选择。
    • 对于未来的读者,以上建议避免使用 Office Interop。从 ASP.NET 或其他服务器技术使用 Office 互操作是一个可怕的想法。这些 API 是为在桌面应用程序中使用而编写的,用于自动化 Office(一套桌面应用程序)。服务器应用程序在许多方面都不同,这使得在其中使用 Office Interop 是一个非常非常糟糕的主意。它也不受 Microsoft 支持,并且可能违反您的 Office 许可证。见Considerations for server-side Automation of Office
    • @maniak1982 为什么这不是一个选项?我使用 SDK 在幕后编写了许多 excel 文档。当然,它使用较新的.xlsx 文件格式,但这并不意味着它不能完成。
    • OOXML SDK 很好。由于上述原因,不能使用 Office 互操作(在 Office 中编写 VBA 宏时使用的 API)进行自动化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2020-10-27
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多