2011-10-28 22 views
1

本当に大きなcsvファイル(〜100MB)をエクスポートする必要があります。インターネット上で私は、同様のコードを発見し、私の場合のためにそれを実装:ASP.NET MVCプロジェクトで大規模なCSVファイルをダウンロード

public class CSVExporter 
{ 
    public static void WriteToCSV(List<Person> personList) 
    { 
     string attachment = "attachment; filename=PersonList.csv"; 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.ClearHeaders(); 
     HttpContext.Current.Response.ClearContent(); 
     HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
     HttpContext.Current.Response.ContentType = "text/csv"; 
     HttpContext.Current.Response.AddHeader("Pragma", "public"); 
     WriteColumnName(); 
     foreach (Person person in personList) 
     { 
      WriteUserInfo(person); 
     } 
     HttpContext.Current.Response.End(); 
    } 

    private static void WriteUserInfo(Person person) 
    { 
     StringBuilder stringBuilder = new StringBuilder(); 
     AddComma(person.Name, stringBuilder); 
     AddComma(person.Family, stringBuilder); 
     AddComma(person.Age.ToString(), stringBuilder); 
     AddComma(string.Format("{0:C2}", person.Salary), stringBuilder); 
     HttpContext.Current.Response.Write(stringBuilder.ToString()); 
     HttpContext.Current.Response.Write(Environment.NewLine); 
    } 

    private static void AddComma(string value, StringBuilder stringBuilder) 
    { 
     stringBuilder.Append(value.Replace(',', ' ')); 
     stringBuilder.Append(", "); 
    } 

    private static void WriteColumnName() 
    { 
     string columnNames = "Name, Family, Age, Salary"; 
     HttpContext.Current.Response.Write(columnNames); 
     HttpContext.Current.Response.Write(Environment.NewLine); 
    } 
} 

問題は、私が前にダウンロードを開始したいです全体CSVが構築されました(!)。なぜ私はそれもそうだと思うように働かないのですが、私は何を変えなければなりませんか?

+2

二迅速コメント:詳細については、この記事を参照してくださいレスポンス出力は1000行程度です。 –

+0

@Morten Mertner、ありがとう、私はすでにこれを実行しています。これはサンプルです。 –

+1

のコードに基づいています。これをMVCフレームワークのどこに置くのが好きですか?アクションからWriteToCSV()メソッドを呼び出すだけでしたか? –

答えて

4

おそらく、各レコードがストリームに追加された後

Response.Flush(); 

を使用して、クライアントにフラッシュされるように応答を強制することができます。 IEnumerableを に渡し、事前移入リストを避ける(100MBの出力のためにそれが最も可能性の高いエントリをたくさん持っている)、およびフラッシュ:

http://support.microsoft.com/kb/812406

+0

はい、完璧に動作しました。ありがとうございました –

+2

おそらく、ほんの一握りではなく、50または100レコードごとにフラッシュするほうが効率的です。 –

+0

あなたのコメントをアップしました。 –

関連する問題