带有奇怪字符的ASP.NET CSV Excel问题

use*_*345 4 c# vb.net csv export-to-excel

我正在将数据表导出为CSV格式,例如:

    "COL1","COL2","COL3"
    "1","some text", "£232.00"
    "2","some more text", "£111.00"
    "3","other text", "£2.00"
Run Code Online (Sandbox Code Playgroud)

使用ashx处理程序导出的代码非常简单:

    context.Response.Clear()
    context.Response.ContentType = "text/csv"
    context.Response.AddHeader("Content-disposition", "attachment;filename=data.csv")
    context.Response.AddHeader("Cache-Control", "must-revalidate")
    context.Response.AddHeader("Pragma", "must-revalidate")
    context.Response.Write(data)
    context.Response.Flush()
    context.Response.End()
Run Code Online (Sandbox Code Playgroud)

我的问题是当Excel尝试打开导出的文件时,角色Â出现在所有£符号之前,例如£232.00值应该是£232.00.

Mar*_*urd 6

您需要设置编码即Response.ContentEncoding属性.

最后在Re​​flector中查找之后,默认情况ContentEncoding可能是Encoding.Default或者Encoding.UTF8,如果system.web/globalization存在配置节,则除非它被responseEncoding该配置节中的属性覆盖.

至于设置ContentEncoding属性是否完全不同于不这样做:

  • 如果将其设置为与其当前设置相同的对象,则会明确捕获该对象并且不执行任何操作;
  • 但是,如果你更改了设置,它会调用HttpWriter.UpdateResponseEncoding,HttpWriter.FlushCharBuffer在切换到新编码之前调用,如果有任何缓冲要写入的话.
  • 如果你没有设置ContentEncoding它被设置为我在上面提到的默认值,首先引用HttpWriter.UpdateResponseEncoding,在写入任何内容之前肯定会调用它,因为HttpWriter._responseEncodingUpdated在写入方法中检查并且仅True在结束时更新HttpWriter.UpdateResponseEncoding.

因此,我认为OP需要更改编码Unicode,我认为Phil Hale的评论意味着他有一个system.web/globalization需要覆盖的配置部分.

笔记:

  • 现有的代码中调用Response.Clear仅影响内容,而不是标题,那么,违背了我以前的建议,我认为这是相关的,除了删除现有内容的任何机会存在于之前被刷新ContentEncoding的变化.
  • 这基于System.Web.NET Framework 2.0 的Reflector 6输出.

  • 我通过添加`Response.ContentEncoding = Encoding.Default;`来解决这个问题.不确定为什么这是诚实的 (3认同)