none
CSV出力で全レコード出力出来ない。 RRS feed

  • 質問

  • 環境 asp.net 2.0 

    困っているのは、CSV出力レコード数が増えると、エクセル表示出力レコード数が減少(欠落)します。
    どなたか、助けて下さい。

    例;
    col1 col2 col3 col4
    aaa rrrrr  hh  mm
    bbb ssss  nn  欠落

    以下コードです。
    //SQLサーバーより抽出し、datasetを作成し
    //以下の処理で出力しています。

    //データテーブルからCSVに出力
                DataTable dt = mydataset.Tables["dt"];
                StringBuilder sb = new StringBuilder();
          string _Name = "export";
         foreach (DataColumn col in dt.Columns)
             {
                 sb.Append(col.ColumnName + ",");
              }
                 sb.Remove(sb.Length - 1, 1);
                  sb.Append(Environment.NewLine);
                
          foreach (DataRow row in dt.Rows)
              {
           for (int i = 0; i < dt.Columns.Count; i++)
                {
                  sb.Append(row[i].ToString() + ",");
                 }
               sb.Append(Environment.NewLine);
               }

          Response.ClearHeaders();
                Response.AppendHeader("Content-Disposition", "attachment; filename=" + _Name + ".csv");
                Response.AppendHeader("Content-Length", sb.Length.ToString());           
                Response.ContentType = "text/csv";
                Response.Write(sb.ToString());
                   Response.End();

    追記、データテーブルのレコード数は、間違いなく取得されています。
               

    2009年8月27日 10:00

回答

  • レコード数が増えると欠落するというよりは、データの中に日本語が入っているから欠落するということではないでしょうか。
    エンコーディングの指定をしていないのが少々ひっかかります。
    sb.Length はあくまでも「文字数」で、Content-Length には「バイト数」を指定しないといけないはずなので、
    データに日本語が入ると両者の値はずれてしまうはずです。
    (Reponse.ContentEncoding のデフォルトって UTF-8 でしたっけ?)

    • 回答としてマーク 菊地俊介 2009年9月3日 9:32
    2009年8月27日 11:32
  • ページディレクティブに ResponseEncoding="Shift_JIS" ContentType="application/octet-stream" を追加したら
    うまくいくのでは?

    ContentType="application/octet-stream" は必要なかったかも。
    • 回答としてマーク 菊地俊介 2009年9月3日 9:32
    2009年8月27日 13:05

すべての返信

  • レコード数が増えると欠落するというよりは、データの中に日本語が入っているから欠落するということではないでしょうか。
    エンコーディングの指定をしていないのが少々ひっかかります。
    sb.Length はあくまでも「文字数」で、Content-Length には「バイト数」を指定しないといけないはずなので、
    データに日本語が入ると両者の値はずれてしまうはずです。
    (Reponse.ContentEncoding のデフォルトって UTF-8 でしたっけ?)

    • 回答としてマーク 菊地俊介 2009年9月3日 9:32
    2009年8月27日 11:32
  • ページディレクティブに ResponseEncoding="Shift_JIS" ContentType="application/octet-stream" を追加したら
    うまくいくのでは?

    ContentType="application/octet-stream" は必要なかったかも。
    • 回答としてマーク 菊地俊介 2009年9月3日 9:32
    2009年8月27日 13:05
  •  


    解決しました。  ttojoさん、surfeOnWnnさんありがとうございました。


    解決策:
    Response.AppendHeader("Content-Length", sb.Length.ToString());の構文が
    邪魔だったようです。なかなか気付きませんでした。

    2009年8月27日 23:59
  • 皆様、こんにちは。

    totojoさん、SurferOnWwwさん、いつも回答ありがとうございます。

    cak00770さん、問題が解決して何よりです。また、結果を投稿していただきありがとうございます。
    有用な情報と思われたため、勝手ながらtotojoさん、SurferOnWwwさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    2009年9月3日 9:35