2017-06-08 4 views
0

VS 2012から2015にプロジェクトをアップグレードする途中で、Excelファイルをエクスポートする最終エラーが発生しました。私はNPOIを使ってExcelファイルとそれをエクスポートするコードを作成しています。コードは、Response.Endの()ラインをヒットしたら、私は次のようなエラーメッセージが表示されます:スローされVS 2015にアップグレードして、Response.EndのためにExcelをエクスポートできない

例外:がmscorlib.dll 追加情報の「System.Threading.ThreadAbortException」:スレッドが中止されていました。

ファイルはまだダウンロードされて完全に開きます。私はResponse.End()行をコメントアウトし、コードからエラーを受け取りませんでしたが、Excelファイルを開くときに次のエラーが表示されます。

'ContactNPOI.xlsx' 。できるだけリカバリーして欲しいですか?このブックのソースを信頼する場合は、[はい]をクリックします。

私はResponse.End()なしでストリームが正常に閉じていないと仮定しますか?私は調査を開始し、これが既知の問題であることを発見し、Response.End()の代わりにHttpContext.Current.ApplicationInstance.CompleteRequest()を使用しようとしました。私はこれを試して、コードからエラーは受け付けませんでしたが、残念ながらExcelファイルを開くときに上記のエラーが発生しました。

以下は私のコードスニペットですが、誰かがこれに修正を提案できますか、またはExcelファイルをエクスポートするためのもっとクリーンな方法ですか?

XSSFWorkbook wb = new XSSFWorkbook(); 
XSSFSheet sh = (XSSFSheet)wb.CreateSheet("Instructional Hrs"); 

//Create Header Row 
var headerRow1 = sh.CreateRow(0); 
headerRow1.CreateCell(0).SetCellValue("Jimmy G Rocks!!"); 

using (var stream = new MemoryStream()) 
{ 
    Response.Clear(); 
    wb.Write(stream); 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "ContactNPOI.xlsx")); 
    Response.BinaryWrite(stream.ToArray()); 
    Response.Flush(); 
    Response.End(); 
    //HttpContext.Current.ApplicationInstance.CompleteRequest(); 
} 
+0

エラーを再現できませんでした。あなたのコードは私のために働いていた。 ThreadAbortExceptionをスローする[Response.End](https://msdn.microsoft.com/en-us/library/system.web.httpresponse.end(v = vs.110).aspx)が正常であることに注意してください。 – krlzlx

+0

試してくれてありがとう...この同じコードはVS 2012で正常に動作したので、何年も前にメッセージを隠すために何かをしたのか、覚えていないのか、何をしていないのか分かりません。エラーが発生していないファイルをエクスポートするより良い方法があるかどうかを知っていますか? –

+1

私は 'Response.End()'の前に 'Response.Close()'がある以外は、クライアントにファイルを送るのとまったく同じコードを使用しましたが、違いはないと思います。この[質問](https://stackoverflow.com/q/20988445/1351076)をチェックしましたか? – krlzlx

答えて

0

助けるため@krlzlxするおかげで...ここにVisual StudioのいずれかまたはExcelファイルを開くときにエラーをスローしません最終的には私のために働いたソリューションは、です:

using (var stream = new MemoryStream()) 
{ 
    Response.Clear(); 
    wb.Write(stream); 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "CCR Student Instructional Hours.xlsx")); 
    Response.BinaryWrite(stream.ToArray()); 
    Response.Flush(); 
    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
    Response.Close(); 
} 

Response.End()をHttpContext.Current.ApplicationInstance.CompletelRequest()で置き換えると言っているサイトがたくさんありましたが、Excelシートを開くときにその行をスワップするだけでエラーが発生していました。再生を続けた後、CompleteRequest行の後にResponse.Close()を追加するとExcelのエラーがなくなり、エラーを無料でダウンロードできます。

+0

私はNPOIを使ってExcelファイルを作成していますが、wb変数はNPOIで作成したワークブックです... –

関連する問題