2013-09-05 165 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來獲取列表分隔,並設置在一個cookie,然後您可以從您的服務器檢測根據需要

,也有你嘗試改變,以生成該文件的的contentType

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 

application/vnd.ms-excel 
+0

我只控制Web服務器而不是客戶端。通過使用ListSeparator,這會對讀取CSV的客戶端產生什麼影響? – thomas

+0

@thomas我已經在我的響應中包含了一個javascript方法,以便在服務器端進行修改,但在客戶端上執行以檢測列表分隔符 –

+0

是的,這樣做的訣竅。謝謝 :-) – thomas