【解決方法】ASP.NET で Excel をエクスポートしてもエラーは発生しません

プログラミングQA


データ アクセス レイヤーからデータをエクスポートしようとしています
しかし、エラーは発生せず、エクスポートされません。 エラーがないので何が悪いのかわかりにくい

私が試したこと:

C#
<pre>if (dt.Rows.Count > 0){
          dgv.DataSource = dt;
         dgv.DataBind();

         Response.ClearContent();
         Response.AppendHeader("content-disposition","attachement;filename=transaction.xls");
         Response.ContentType = "application/excel";
         StringWriter stringWritter = new StringWriter();
         HtmlTextWriter htmlTextWritter = new HtmlTextWriter(stringWritter);

        dgv.RenderControl(htmlTextWritter);
        Response.Write(stringWritter.ToString());

        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.SuppressContent = true;
        HttpContext.Current.ApplicationInstance.CompleteRequest();
}

これも試しました

C#
Html32TextWriter osHtmlTextWritter = new Html32TextWriter(osStringWritter);
       DataTable dt = new DataTable();
       DataGrid dgv = new DataGrid();

       Response.Clear();
       Response.Buffer = false;
       Response.ContentType = "application/vnd.ms-excel";
       Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", "TransactionReport"));
       Response.Charset = "";

       dgv.DataSource = dt;
       dgv.DataBind();

       dgv.RenderControl(osHtmlTextWritter);
       Response.Write("Report Datw:" + DateTime.Now);
       Response.Write(osStringWritter.ToString());
       //Response.End();
       HttpContext.Current.Response.Flush();
       HttpContext.Current.Response.SuppressContent = true;
       HttpContext.Current.ApplicationInstance.CompleteRequest();

      dgv = null;
      osStringWritter = null;
      osHtmlTextWritter = null;

それでもエラーは発生しません。
私のgridViewにもデータがあります

解決策 1

「エラーなし」とは、アプリにとって致命的なことが何も発見されなかったことを意味するだけであり、アプリが何らかの形で期待どおりに動作することを意味するものではありません!

開発プロセスは電子メールを書くことと考えてください。コンパイルが成功したということは、電子メールを適切な言語 (たとえば、ドイツ語ではなく英語) で作成したことを意味します。電子メールに送信したいメッセージが含まれていたわけではありません。

これで、開発の第 2 段階に入ります (実際には第 4 段階または第 5 段階ですが、後で前の段階に進みます): テストとデバッグです。

それが何をするのか、そしてそれがあなたが望んでいたものとどのように違うのかを見ることから始めてください。 これは、なぜそれを行っているのかについての情報を提供するため、重要です。 たとえば、プログラムがユーザーに数字を入力させることを目的としており、それを2倍にして答えを出力する場合、入力/出力が次のようになると:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

次に、問題がそれを2倍にするビットにあることは明らかです-それ自体を加算したり、2倍したりするのではなく、それ自体を乗算して入力の2乗を返します。
それで、コードを見ることができ、それがここのどこかにあることは明らかです:

C#
private int Double(int value)
   {
   return value * value;
   }

何がうまくいかないのかがわかったら、デバッガーを使用して原因を突き止めます。 メソッドの最初の行にブレークポイントを置き、アプリを実行します。 ブレークポイントに到達すると、デバッガーが停止し、制御がユーザーに渡されます。 コードを行ごとに実行し (「シングル ステップ」と呼ばれます)、必要に応じて変数の内容を確認 (または変更) できるようになりました (コードを変更して、必要に応じて再試行することもできます)。
コードを実行する前に、コードの各行が何をすべきかを考え、「ステップ オーバー」ボタンを使用して各行を順番に実行したときに実際に何をしたかを比較します。 それはあなたが期待したことをしましたか? その場合は、次の行に進みます。
そうでない場合、なぜですか? どう違うの?
うまくいけば、そのコードのどの部分に問題があり、何が問題なのかを突き止めるのに役立つはずです。
これはスキルであり、開発だけでなく現実の世界でも役立つため、開発する価値のあるスキルです。 そして、すべてのスキルと同様に、それは使用することによってのみ向上します!
そして、ここであなたを助けることはできません: 正確に何が起こっているのかを確認するために、おそらくあなたのシステム上であなたのデータを使ってあなたのコードを実行する必要があります.

解決策 2

Excel ワークブックを生成していません。 あなたのコードは、”application/excel” の MIME タイプで HTML を応答ストリームに書き込んでいます。 これは有効な Excel ブックではありません。

SDK を使用して、OpenXML SDK、ClosedXML SDK などの実際の有効な Excel ワークブックを生成し、ワークブック ファイルを生成して代わりに送信します。

解決策 3

ファイルをダウンロードまたはアップロードするには、完全なポストバックを追加する必要があります。 asyncpostback トリガーの代わりに postbacktrigger を追加し、それが機能するかどうかを確認してください。

コメント

タイトルとURLをコピーしました