関数は、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"

    });
}

これは私が仕事をしたいという関数であるが、それは動作しませんし、私は私が間違って持っているものを見ることができません。

エクセルコードへのエクスポート

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、私の問題を解決するだろう、私のダイナミックボタンをやり直ししようとするならば作品、私は思っていました。

提供される可能性の洞察力に感謝。

クラウディオ・ヴァレリオ:

まず第一に、私はExcelを生成するために、GridViewコントロールを使用することはありません。「簡単」であるにもかかわらず、それはXLSファイル拡張子を持つ実際のExcelファイルではなく、HTMLファイルを生成しません。

<div>
    <table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;">
        <tr>
            <th scope="col">col1</th><th scope="col">col2</th>
        </tr><tr>
            <td>1</td><td>product 1</td>
        </tr><tr>
            <td>2</td><td>product 2</td>
        </tr><tr>
            <td>3</td><td>product 3</td>
        </tr><tr>
            <td>4</td><td>product 4</td>
        </tr><tr>
            <td>5</td><td>product 5</td>
        </tr><tr>
            <td>6</td><td>product 6</td>
        </tr><tr>
            <td>7</td><td>product 7</td>
        </tr>
    </table>
</div>

この開かれたときは、これを引き起こすことで、ファイルの結果: ExcelのエラーHTMLテーブルを開くとき

それはかなり迷惑な(と専門外)です。XLS - - あなたが古いExcelバージョンに囲まれていない場合は、最新のファイル形式のxlsxを使用することができ、私はむしろDocumentFormat.OpenXml nugetパッケージまたはExcelを生成するための他のパッケージ/ライブラリを使用すると思います。あなたは多くの列を持っているし、あなただけのレポートへのオブジェクトのフラットなリストを持っているとき正直なところ、DocumentFormat.OpenXmlは、強力で使用することに少し退屈です。あなたは、.NET Frameworkの(ないDOTNETコア)を使用している場合は、CsvHelper.Excel nugetパッケージを試すことができます。使い方は非常に簡単です。あなたのExportToExcel方法は次のようになります:

public ActionResult ExportToExcel(string id)
{
    // TODO: Replace with correct products retrieving logic using id input
    var products = new [] {
       { col1 = 1, col2 = "product 1" },
       { col1 = 2, col2 = "product 2" },
       { col1 = 3, col2 = "product 3" },
       { col1 = 4, col2 = "product 4" },
       { col1 = 5, col2 = "product 5" },
       { col1 = 6, col2 = "product 6" },
       { col1 = 7, col2 = "product 7" },
       { col1 = 1, col2 = "product 1" },
       { col1 = 1, col2 = "product 1" },
    };

    var ms = new MemoryStream();
    var workbook = new XLWorkbook();
    using (var writer = new CsvWriter(new ExcelSerializer(workbook)))
    {
       writer.WriteRecords(products);
    }
    workbook.SaveAs(ms);
    ms.Flush();
    ms.Seek(0, SeekOrigin.Begin);
    return File(ms, MimeMapping.GetMimeMapping("file.xlsx"), $"MyExcelFile.xlsx");

}

かなり強力なもう一つのパッケージには、あなたがたDataTableを読み込むことができますEPPlus、である(この参照https://stackoverflow.com/a/53957999/582792を)。

新しいExportToExcelアクションに場所を設定したら、それだけでファイルをダウンロードしてください:AJAXの部分に来て、よく...私はあなたがすべてでそれを必要とは思いません。あなたはあなただけのことができ、コレクションにあなたの項目ごとに、ブートストラップ3を使用していると仮定すると:

<a href="@Url.Action("ExportToExcel", "Profile", new {id=item.Id})" class="btn btn-info">
<i class="glyphicon glyphicon-download-alt" />
</a>

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=7580&siteId=1