2014-11-15 84 views
0

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

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

当我运行这段代码,然后点击它的按钮,其实农产品和Excel在单元格A1测试“foo”的文件。问题是,我从IE以下错误消息:

error message displayed by Excel

我在做什么错?我如何生成文件,以便它不会导致显示错误消息?

+0

应该是应用程序/ vnd.ms-excel而不是application/vmd.ms-excel(vmd - > vnd) – 2014-11-15 00:13:44

+0

Maxim,是的,你是对的。但这并不能解决问题。我正在更新代码以反映此更正。 – JonnyBoats 2014-11-15 00:18:02

+0

如果这是一个重复的问题,请您提供一个链接,回答这个问题的答案?被认为是重复的链接问题不会问“我如何生成文件,以便它不会导致显示错误消息?“更重要的是没有回答这个问题。 – JonnyBoats 2014-11-15 03:13:16

回答

0

您不能隐式创建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

+2

或者使用/学习非常自由的[OpenXML SDK](http://www.microsoft.com/en-us/download/details.aspx?id=5124)到[生成Excel工作簿](http://msdn.microsoft .com/en-us/library/office/hh180830%28v = office.14%29.aspx) – ethorn10 2014-11-15 00:44:30

+0

我并不反对这个建议,特别是如果它是一个简单的工作簿。如果你想写xls文件格式,但这不是一个选项 – maniak1982 2014-11-15 00:49:25

+1

对于将来的读者,上述建议避免使用Office Interop。从ASP.NET或其他服务器技术使用Office Interop是一个可怕的想法。这些API是为在桌面应用程序中使用而编写的,用于自动化Office(一套桌面应用程序)在许多方面,阳离子都是不同的,因此在它们中使用Office Interop是非常非常糟糕的主意。它也不受Microsoft的支持,并可能违反您的Office许可证。请参阅[有关Office的服务器端自动化的注意事项](http://support.microsoft.com/kb/257757) – 2014-11-15 00:52:39

1

HTML是不是一个Excel工作簿。

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

就你而言,Excel打开文件,将其检测为HTML,并将其读为一个HTML表格并将其转换为电子表格。您的代码实际上并未发送“真实”的Excel工作簿 - 因此您的MIME类型完全不正确。

如果你想要一些总是“正常工作”的东西,我建议让用户以CSV格式下载数据,这有利于在Microsoft Excel,Apple数字,OpenOffice Calc和跨平台中开放' 记事本。确保你的服务为text/csv