2013-09-05 7 views
1

У меня есть код для отправки результата данных пользователю как CSV. Это отлично работает с Excel 2013, но в Excel 2007 он не будет разбиваться на столбцы, а скорее на данные, вставленные только в один столбец.Экспорт CSV-файла в Excel 2007

Есть ли способ сообщить Excel, как разделить текст (он разделен;)? Вот мой код:

public async Task ExcelResultList(int id) 
    { 
     var asString = await Resolver.Resolve<IHandoutManager>().GetResultListAsStringAsync(id); 
     var handout = await Resolver.Resolve<IHandoutManager>().GetHandout(id); 

     var filename = string.Format("{0} registrations - {1:yyyy-MM-dd}.csv", handout.Name, DateTime.Now); 
     var contenttype = "application/csv"; 
     Response.Clear(); 
     Response.ContentType = contenttype; 
     Response.AddHeader("content-disposition", "attachment;filename=" + filename);    
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.ContentEncoding = Encoding.Unicode; 
     Response.Write(asString); 
     Response.End(); 
    } 
+0

.csv означает «значение, разделенное запятыми», а в старых версиях Excel, включая Excel 2010, разделитель должен был фактически быть запятой «,» для автоматического обнаружения столбцов для работы. Наиболее простым решением было бы заменить ваш «;» с ",". – Stewbob

+0

Разница фактически основана на региональных настройках компьютера «,» не всегда является разделителем списков для всех языков/стран. –

ответ

2

Для того, чтобы убедиться, что вы используете правильный ListSeparator ("" или ";") использовать этот

System.Globalization.CultureInfo.CurrentCulture.TextInfo. ListSeparator

Но поскольку у вас есть доступ к стороне сервера только, то вы можете включить этот JavaScript в любой из ваших страниц,

function getListSeparator() { 
    var list = ['a', 'b'], str; 
    if (list.toLocaleString) { 
     str = list.toLocaleString(); 
     if (str.indexOf(';') > 0 && str.indexOf(',') == -1) { 
      return ';'; 
     } 
    } 
    return ','; 
} 

Ключ в toLocaleString метод, который использует системный список разделитель на стороне клиента

, чтобы получить разделитель списка и установить его в куки, которые вы могли бы обнаружить с сервера Вы можете использовать JavaScript для создания файла в случае необходимости

а также попытаться изменить ТипСодержимого к

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 

или

application/vnd.ms-excel 
+0

У меня есть только контроль над веб-сервером, а не с клиентами. Используя ListSeparator, это повлияет на клиентов, читающих CSV? – thomas

+0

@thomas Я включил javascript aproach в свой ответ, так что изменен на стороне сервера, но выполняется на клиенте, чтобы обнаружить разделитель списка. –

+0

Да, это сделало трюк. Спасибо :-) – thomas

Смежные вопросы