web-dev-qa-db-ja.com

ajaxメソッドを介して関数が呼び出されたときにExcelファイルがダウンロードされない

状況

Xアイテムのグリッドがあり、各アイテムに印刷ボタンがあるアプリケーションに取り組んでいます。この印刷ボタンをクリックすると、グリッド項目のIDをコントローラーに渡すajax関数を呼び出すことができます。そのIDに基づいて関連データを取得し、Excelファイルにダウンロードします。 (特定のアイテムの取得はまだ行われていません)

これまでのところ

これまでのところ、グリッドと共にExcelファイルをダウンロードする基本的なコードがあります。

問題

私が直面している問題は、「印刷」ボタンをクリックしても、何も起こらないことです。exporttoexcel関数にブレークポイントがあっても、関数が入力され、それをステップ実行できることを示しています。エラー、何も起こりません。しかし、同じ関数を呼び出すランダムなボタンを追加し、そのボタンをクリックすると、Excelファイルがダウンロードされました。結果として、この問題はaJaxと関係があると思います。

コード

_<input type="button" value="Test" onclick="location.href='@Url.Action("ExportToExcel", "Profile")'" />
_

これはファイルをダウンロードするコードです。追加したシンプルなボタンでした。

_function ExportToExcel(id) {
    $.ajax({
        type: "POST",
        url: "@Url.Action("ExportToExcel", "Profile")",
        data: { "id": id },
        dataType: "json"

    });
}
_

これは私が働きたい機能ですが、うまくいかず、何が悪いのかわかりません。

Excelコードにエクスポート

_public void ExportToExcelx()
{
    var products = new System.Data.DataTable("teste");
    products.Columns.Add("col1", typeof(int));
    products.Columns.Add("col2", typeof(string));

    products.Rows.Add(1, "product 1");
    products.Rows.Add(2, "product 2");
    products.Rows.Add(3, "product 3");
    products.Rows.Add(4, "product 4");
    products.Rows.Add(5, "product 5");
    products.Rows.Add(6, "product 6");
    products.Rows.Add(7, "product 7");


    var grid = new GridView();
    grid.DataSource = products;
    grid.DataBind();

    Response.ClearContent();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
    Response.ContentType = "application/ms-Excel";

    Response.Charset = "";
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);

    grid.RenderControl(htw);

    //Response.Output.Write(sw.ToString());
    //Response.Flush();
    //Response.End();
    // =============


    //Open a memory stream that you can use to write back to the response
    byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString());
    MemoryStream s = new MemoryStream(byteArray);
    StreamReader sr = new StreamReader(s, Encoding.ASCII);

    //Write the stream back to the response
    Response.Write(sr.ReadToEnd());
    Response.End();



    //  return View("MyView");
}
_

理論

エラーはどういうわけかaJaxに結びついていると思います、私はこのようにコントローラーにボタンも作成しています。 "<button type='button' class='btn btn-warning' onclick='ExportToExcel(" + c.id + ");'>Print</button>",

_location.href='@Url.Action_が機能するので、動的ボタンをやり直すことで問題が解決するかどうか疑問に思いました。

提供できる可能性のある洞察を感謝します。

6
Niana

PDFでこれを機能させる方法を次に示します。 Excelのダウンロードは同様である必要があります

$.ajax({
  url: '<URL_TO_FILE>',
  success: function(data) {
    var blob=new Blob([data]);
    var link=document.createElement('a');
    link.href=window.URL.createObjectURL(blob);
    link.download="<FILENAME_TO_SAVE_WITH_EXTENSION>";
    link.click();
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

または download.js を使用します

$.ajax({
  url: '<URL_TO_FILE>',
  success: download.bind(true, "<FILENAME_TO_SAVE_WITH_EXTENSION>", "<FILE_MIME_TYPE>")
});
0
Mayur Padshala