私が見つけた Excel コードへの変換に問題があります。私は.NET 4.0でWebサイトプロジェクトに取り組んでおり、次のことを行うクラスを作成しました( http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.htmlに基づく):
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition",
string.Format("attachment; filename={0}", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; using (StringWriter sw = new StringWriter()) {
using (HtmlTextWriter htw = new HtmlTextWriter(sw)) {
//Create a table to contain the grid
//Add header row
//Add each data row
//Add Footer row
//Render the table into the htmlwriter
// render the htmlwriter into the response
HttpContext.Current.Response.Write(sw.ToString());
HttpContext.Current.Response.End();
}
}
ページに表示される GridView に追加されるボタンを含むユーザー コントロールからこのクラスを呼び出します。これは期待どおりに機能します。ボタンをクリックすると、GridView からのデータを含む結果の Excel スプレッドシートを開くか保存するためのダウンロード オプションが表示されます。
ただし、別の GridView 内の linkbutton からこれを呼び出すと、動的なグリッドビューを作成してデータを格納し、それをエクスポートしたいと考えています。これを行うと、クラスの Response.End 呼び出しから ThreadAbortException が発生します。
質問 1: ユーザー コントロール内から同じコードを呼び出したときに ThreadAbortException が発生しないのはなぜですか? ユーザーコントロールは独自のスレッドまたはその他の種類のコンテキストを取得しますか?
その ThreadAbortException が発生したときに発生するエラーを検索すると、それを ApplicationInstance.CompleteRequest() に置き換えようとしました。これを行うと、ThreadAbortException を取得しなくなりましたが、これにより、以前に機能していたユーザーコントロールが壊れます。グリッドからのデータを含む結果の Excel スプレッドシートではなく、含まれているページの HTML が含まれており、とにかく簡単に抑制できます。空のキャッチでそのエラー。ただし、動的に生成された GridView を使用した直接呼び出しは修正されません。そのコードは、「サーバーから受信したメッセージを解析できませんでした」という JavaScript エラーをレンダリングします。
ここで何が起こっているのか正確に理解したいのですが、理解に関係なく結果が必要なところです。私が試した他のすべてのアプローチ(GridViewの代わりにデータグリッドなど)は同じ問題に遭遇し、現在の応答を「引き継ぎ」、stringwriterとhtmlwriterを使用してデータをExcel contentType で応答します。そして、これはユーザーコントロールのコンテキストで明らかに機能するため、直接呼び出されたときに機能しない理由について、私は機知に富んでいます...