ASP.NET CSV Excel проблема со странными символами - PullRequest
4 голосов
/ 15 марта 2010

Я экспортирую таблицу данных в формат CSV, например ::10000

    "COL1","COL2","COL3"
    "1","some text", "£232.00"
    "2","some more text", "£111.00"
    "3","other text", "£2.00"

Код для экспорта довольно прост с использованием обработчика 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()

Моя проблема заключается в том, что когда Excel пытается открыть экспортированный файл, знак  появляется перед всеми знаками £, например. £232.00 когда значение должно быть £232.00.

Ответы [ 2 ]

6 голосов
/ 16 марта 2010

Вам необходимо установить кодировку, т.е. свойство Response.ContentEncoding.

После окончательного поиска в Reflector значением по умолчанию ContentEncoding, вероятно, будет Encoding.Default или Encoding.UTF8, если существует раздел конфигурации system.web/globalization, если он не переопределен свойством responseEncoding в этой конфигурации. раздел.

Относительно того, работает ли вообще свойство ContentEncoding, иначе это не будет:

  • Если вы установите для него тот же объект, что и его текущие настройки, он явно перехватит это и ничего не сделает;
  • Однако, если вы измените настройку, она вызывает HttpWriter.UpdateResponseEncoding, которая вызывает HttpWriter.FlushCharBuffer перед переключением на новую кодировку, если есть что-то буферизованное для записи уже.
  • Если вы не установите ContentEncoding, то будет установлено значение по умолчанию, о котором я упоминал выше, при первой ссылке на HttpWriter.UpdateResponseEncoding, который определенно вызывается перед записью любого содержимого, поскольку HttpWriter._responseEncodingUpdated проверяется в методах записи и обновляется только до True в конце HttpWriter.UpdateResponseEncoding.

Таким образом, я полагаю, что OP нужно было изменить кодировку на Unicode, и я предполагаю, что комментарий Фила Хейла означает, что у него был system.web/globalization раздел конфигурации, который требовал переопределения.

Примечания:

  • Существующий код, вызывающий Response.Clear, влияет только на контент, а не на заголовки, поэтому, вопреки моему предыдущему предложению, я не считаю, что это уместно, за исключением устранения какой-либо возможности существующего контента быть подарок должен быть сброшен до изменения ContentEncoding.
  • Это основано на выводе Reflector 6 из System.Web из .NET Framework 2.0.
0 голосов
/ 14 сентября 2016

Это сработало для меня - другие не

Response.ContentEncoding = System.Text.Encoding.Default
...