【问题标题】:"Unable to read file" error in IE when "Open" html file with Excel, but not when "Save" first使用 Excel“打开”html 文件时 IE 中出现“无法读取文件”错误,但首先“保存”时不会出现
【发布时间】:2014-08-17 14:27:16
【问题描述】:

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

我在 Web 应用程序中有 .Net 代码,该代码根据从数据库中提取的数据动态创建 html 表,然后将其流式传输到用户的 Web 浏览器以在 Excel 中打开。这在 Chrome 中运行良好。只要用户在单击“下载”链接后选择“保存”选项(在打开文件之前保存文件),而不是“打开”选项 - 它试图读取正在被流式传输到客户端。但是在 IE 11 中,如果他们选择“打开”选项,他们会从 Excel 收到有关文件格式的警告(因为它是一个 html 文件 - 如果他们先保存也会发生同样的情况,这是可以接受的),但是当他们仍然单击“是”打开时,他们会看到“无法读取文件”。错误信息。

在一种情况下,我可以通过用单词“and”替换数据中的“&”实例来解决此问题。但是,在其他情况下,我无法确定可能导致问题的特定数据值。同样,只要用户先保存文件,文件就可以正常打开。 (事实上​​,当我在我的开发环境中单击“打开”而不是“保存”时,它甚至可以正常工作 - 但当我从部署代码的测试服务器中执行此操作时,它就不行了。)

因此,我正在寻找一种方法来删除/替换显示在 html 表的“td”元素中的所有有问题的数据,或者更好的是,某种方法可以使“打开”选项具有相同的结果作为“保存”选项。同样,只要先保存文件,html 表格内容就可以正常打开。

html 表是由 C# 类生成的,但流式传输文件的页面位于 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();
}

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

【问题讨论】:

  • 如果您希望您的用户使用Excel 打开此文件,为什么不发送逗号分隔文件CSV 而不是HTML
  • 业务用户的要求是用户在打开 Excel 文件后不必对其进行格式化(就这么简单)。使用 html 表格,标题将是粗体,并且所有列都将被扩展以适应内容,而用户无需执行任何操作。据我所知,没有办法用 csv 文件来实现。使用html,他们会得到警告提示,但业务用户并不关心。
  • 他们必须编辑那个文件吗?而且,您还可以使用文本格式等创建“实际”xls 文件作为模板。然后使用microsoft ACE oleDb 填充该文件,只需将数据直接从数据库泵入工作簿,就像在数据库之间一样。每次您抓取模板时,填写并发送。
  • 他们可以对文件做任何他们喜欢的事情,但他们不会为了将更改保存回系统而上传文件(我想这就是你所得到的)。
  • 关于您使用 microsoft ACE oleDb 的建议,这可能是我需要探索的一个选项,如果他们不能在打开文件之前保存文件(如此简单!)。但实际上这并没有触及我真正想要弄清楚的核心 - 为什么文件不可读,除非它首先保存到磁盘?我的意思是,它是完全相同的文件 - 相同的内容。为什么 Excel 在从流中打开时出现问题?

标签: c# html vb.net excel internet-explorer


【解决方案1】:

我遇到了同样的问题,从下面的行中删除“.vnd”开始为我工作。

Response.ContentType = "application/ms-excel"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2018-10-24
    相关资源
    最近更新 更多