为什么在打开.xls文件时显示错误消息

在我的asp.net,C#应用程序中,我们正在生成并下载.xls文件。 但是当我试图打开时,它正在传递信息

“您尝试打开的文件’filename.xls’的格式与文件扩展名指定的格式不同。在打开文件之前,请validation文件是否已损坏且来自受信任的来源。是否要打开现在的文件?“

如果我按“是”它就会打开。 我将文件扩展名更改为.xlsx,仍然是相同的消息。 谁能告诉我为什么会这样? 我在IIS管理器中添加了.xlsx MIME类型扩展,MIME类型为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 。 它仍然显示相同的消息。 请建议我如何摆脱它。

您是完全创建xls文件还是复制并填充模板xls文件? 格式模板文件不正确可能会导致问题。

此外,您使用什么提供商来填写您的文件? – 用于xlsx / xlsm的Microsoft.ACE.OLEDB.12.0? – 适用于xls的Microsoft.Jet.OLEDB.4.0?

不正确的提供商/扩展组合可能会导致问题。

根据你的评论,这里是我过去做过的代码的一部分:(注释了一些行,因为我不记得为什么它们有用)

 Response.Clear(); Response.ContentType = "application/vnd.ms-excel"; //Response.ContentEncoding = Encoding.Default; //Response.Charset=""; Response.AddHeader("Content-Disposition: ", String.Format(@"attachment; filename={0}",myfileName)); //EnableViewState = false; Response.Write(myFileContentAsString); Response.Flush(); Response.Close(); 

这个可能是一个旧post,但我一直在寻找相同问题的答案,并认为它可能有用。 它看起来与应用程序将xls文件提供给浏览器的方式无关。 这是Office 2007过多安全性的问题。

微软的知识库文章948615解释了它:

在Excel 2007中打开文件时,会收到一条警告,指出文件格式与文件扩展名指定的格式不同。

唯一的解决方案是将en条目添加到客户端的注册表中。 我知道对于一个可能有数百个用户的Web应用程序来说,这不是一个真正的解决方案,但至少你可以在页面上添加一个注释来告诉如何解决这个烦人的警告。

不确定如何将数据导出到Excel。 将DisplayAlerts设置为false可能会有所帮助。

 xlApp = new Excel.Application(); xlApp.DisplayAlerts = false; 

我使用interop DLL。 命名空间是Microsoft.Office.Interop.Excel 。 请参阅以下链接中关于如何添加引用的Feng Chen的答案: http : //social.msdn.microsoft.com/Forums/en/netfxsetup/thread/c9e83756-4ae2-4ed4-b154-1537f3bb3a22

以下链接也可能有所帮助:

http://www.dotnetperls.com/excel

警报是Excel 2007中称为扩展强化的新安全function,可确保打开的文件内容与尝试打开文件的shell命令中指定的扩展类型相匹配。 除非URL的扩展名为.HTM / .HTML / .MHT / .MHTML,否则当前设计不允许您从Excel中的网站打开HTML内容。 因此,返回HTML并将MIME类型设置为类似XLS以尝试强制HTML在Excel而不是Web浏览器(如预期)中打开的ASP页面将始终获得安全警报,因为内容与MIME类型不匹配。

http://blogs.msdn.com/b/vsofficedeveloper/archive/2008/03/11/excel-2007-extension-warning.aspx

您在文件名中使用.xls,在MIME类型中使用.xlsx。 尝试使用filname.xlsx。

文件扩展名.xls(版本2003)支持HTML布局,而Office 2007及更高版本不支持它。

您必须将excel文件导出为.xlsx格式。 根据我的经验,它将在所有版本中支持它。

将以下DLL添加到bin文件夹中

  • ClosedXML.dll
  • DocumentFormat.OpenXml.dll

将文件导出到.xlsx的代码

  DataTable dt = new DataTable(); //Create column and inser rows using (XLWorkbook wb = new XLWorkbook()) { var ws = wb.Worksheets.Add(dt, Sheetname); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Buffer = true; HttpContext.Current.Response.Charset = ""; HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + p_FileName + ".xlsx"); using (MemoryStream MyMemoryStream = new MemoryStream()) { wb.SaveAs(MyMemoryStream); MyMemoryStream.WriteTo(HttpContext.Current.Response.OutputStream); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } }