当用Excel打开HTML文件时,IE中的“无法读取文件”错误,但是当首先“保存”

这是我在这个论坛的第一个问题,所以请原谅任何新手的错误。

在.NET应用程序中,我有.Net代码,它根据从数据库中提取的数据dynamic创build一个html表格,然后将其stream式传输到用户的web浏览器,以在Excel中打开。 这在Chrome中运行得很好。 只要用户在点击“下载”链接后select“保存”选项(在打开文件之前保存文件),而不是“打开”选项 – 它试图读取文件stream向客户端。 但在IE 11中,如果他们select“打开”选项,他们会从Excel中得到有关文件格式的警告(因为它是一个html文件 – 如果先保存,同样的事情发生,这是可以接受的),但当他们点击“是”打开时,他们会看到“无法读取文件”。 错误信息。

在一个案例中,我能够通过replace实例来解决这个问题,如果数据中的“&”用“and”来代替。 但是,在其他情况下,我无法确定可能导致问题的特定数据值。 而且,只要用户首先保存,文件就可以正常打开。 (事实上​​,当我在开发环境中点击“打开”而不是“保存”时,它甚至可以正常工作,但是当我从部署代码的testing服务器上执行时,却不能正常工作。)

所以,我正在寻找一种方法来删除/replacehtml表格中“td”元素中显示的所有有问题的数据,或者,更好的方法是使“Open”选项具有与“保存“选项。 再次,只要文件被保存,html表格内容就会打开。

html表是由C#类生成的,但是stream式传输文件的页面是在VB.Net中。 我不认为C#代码会有用(但如果有人认为它可以部分发布),但这里是相关部分的VB代码:

Response.Clear() Response.ClearContent() Response.ClearHeaders() Dim htmlTable As String '[snip - populate htmlTable with data from database] Dim fileName As String = "Whatever.xls" Response.Buffer = false Response.ContentType = "application/vnd.ms-excel" Response.AppendHeader("Content-Disposition", "attachment; filename=""" & fileName & """") Response.AddHeader("Content-Length", ASCIIEncoding.ASCII.GetByteCount(htmlTable).ToString()) Using ms As New MemoryStream(Encoding.ASCII.GetBytes(htmlTable)) ms.WriteTo(Response.OutputStream) Response.Flush() End Using 

更新:我可能已经通过下面的(C#)代码“清理”数据解决了这个问题,但我仍然不明白为什么必须先保存该文件,这将使得这是不必要的。 任何答案将是受欢迎的。

 private string GetDataRow(DataRow dr, List<DataColumnInfo> fieldInfoList) { var sb = new StringBuilder("<tr valign='top' align='left'>"); // see http://stackoverflow.com/questions/4619909/format-html-table-cell-so-that-excel-formats-as-text var forceExcelText = "mso-number-format:\"\\@'\""; fieldInfoList.ForEach(c => { var content = dr[c.FieldName].ToString() .Replace("&", "and") .Replace("<", "") .Replace(">", ""); // replace all non-asccii content = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(dr[c.FieldName].ToString())); sb.Append("<td style='" + forceExcelText + "'>" + content + "</td>"); }); sb.Append("</tr>"); return sb.ToString(); } 

新的更新 – 上面的代码没有解决问题。 在某些情况下,如果先select“打开”选项而不是“保存”,仍然会出错。 如果我先保存,一切都很好。

我面临同样的问题,并从下面的线删除“.vnd”开始为我工作。

 Response.ContentType = "application/ms-excel"