2

Excel ファイルを ASP.Net Web ページのクライアントに送信しようとしていますが、うまくいきません。

ユーザーがボタンをクリックすると、サーバー側データベースの一部のデータがフォーマットされ、Excel ファイルに入れられてユーザーに送信されます (直接ダウンロードとして)。

送信部分を除いて、すべてがうまく機能し、どんな助けも大歓迎です。

これが私が現在使用しているコードです(クライアント側):

var dataAjax = {};
$.ajax({
    async: false,
    type: "POST",
    url: "Default.aspx/BuildExcelFile",
    contentType: "application/json",
    data: JSON.stringify(dataAjax),
    dataType: "text",
    success: function(html) {
        //alert(html);
    },
    error: function(request, status, error) {
        alert("An error occurred : [" + error + "]");
    }

});

そしてサーバー側のコード:

<WebMethod()> _
Public Shared Function BuildExcelFile() As String
    Dim localExcelPath = "C:\temp1111.xlsx"

    'Build the excel file here...
    '...

    'Delete the old version of the Excel file
    System.IO.File.Delete(localExcelPath)
    'Save the Excel File locally
    xWorkSheet.SaveAs(localExcelPath)
    xWorkBook.Close()
    exc.Quit()

    'The generated excel is valid, can be opened on the server just fine

    'Send the excel file to the client
    'This part is not working! :(
    System.Web.HttpContext.Current.Response.Clear()
    System.Web.HttpContext.Current.Response.ContentType = "MS-Excel/xls"
    System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" & System.IO.Path.GetFileName(localExcelPath))
    System.Web.HttpContext.Current.Response.TransmitFile(localExcelPath)
    System.Web.HttpContext.Current.Response.End()

    Return "Success"

End Function

の値を確認しようとすると、このエラーが発生しますCurrent.Response

Response: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.

また、呼び出しを外すと、ajax で関数Response.End()の html 変数にデータが受け取られます。successただし、テキストとして受信するのではなく、ファイルをダウンロードしたい...

Response.End() を保持すると、Internal Server Error.

Webmethod が共有されているために機能していませんか? ここで何が起こっているのか手がかりはありますか?この問題を解決するにはどうすればよいですか?

編集:

問題があれば、.Net 3.5を使用しています

私はMVCを使用していません

4

3 に答える 3

2

クライアントからサーバーにデータを送信するのとまったく同じ問題がありました。ダウンロードを開始する iFrame を動的にロードすることで回避できます。iFrame は基本的に、Page_Load. ファイルをサーバーに保存し、クライアントでダウンロードするためのリンクを提供することもできます。これらは、私が見つけた回避策です。

あなたが試みている方法でそれができるかどうかはわかりません。私はすべての例をチェックしましたが、うまくいきませんでした。あなたがそれを理解できない場合、これらの方法は私のために働いた.

于 2012-11-07T19:59:22.343 に答える
1
Public Shared Function BuildExcelFile() As String
    Dim localExcelPath = "C:\temp1111.xlsx"

    'Build the excel file here...
    '...
    xWorkSheet.SaveAs(localExcelPath)
    xWorkBook.Close()
    exc.Quit()

    'The generated excel is valid, can be opened on the server just fine

    'Send the excel file to the client
    'This part is not working! :(
    System.Web.HttpContext.Current.Response.Clear()
    System.Web.HttpContext.Current.Response.ContentType = "MS-Excel/xls"
    System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" & System.IO.Path.GetFileName(localExcelPath))
    System.Web.HttpContext.Current.Response.TransmitFile(localExcelPath)
    System.IO.File.Delete(localExcelPath)

    System.Web.HttpContext.Current.Response.End()

    Return "Success"
End Function
  1. Ajax を使用している場合は、ボタンのクリック時に postbacktrigger を使用します
于 2013-01-15T18:47:06.060 に答える
0

これは私のために働く:

string fileName = "ExampleFileName.xlsx";
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;  filename=" + fileName);
Response.BinaryWrite(excelPackage.GetAsByteArray());
// Response.End(); Replaced with below 3 lines to avoid ThreadAbortException
Response.Flush(); // Sends all currently buffered output to the client.
Response.SuppressContent = true;  // Gets or sets a value indicating whether to send HTTP content to the client.
ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.

「EPPlus.dll」という dll を Excel ライブラリとして使用しています。Asp.net ボタンからダウンロードをインスタンス化するか、ダウンロードを開始するときにサーバー側コードからメソッドを呼び出すだけでよいため、Ajax 呼び出しは必要ありません。

于 2016-08-11T23:18:58.160 に答える