Question

What I'm trying to implement is giving the users the ability to export the grid data to an excel file and download it, with the help of a file save dialog.

Here's how I have coded it right now -

In Javascript -

$.post("/irn/Identifier/Download", { "columnValues": columnValues });

In the Identifier controllers Download action -

public FileResult Download(string columnValues)
{
    DTData headlineRows = (DTData)Newtonsoft.Json.JsonConvert.DeserializeObject(columnValues, typeof(DTData));
    var e = new Services.DownloadToExcel();
    return File(e.WriteData(headlineRows), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "testfile.xlsx");
}

In the DownloadToExcel class, inside the WriteData function I have -

//Here, I'm using the EPPlus library to write the column data to an excel file and then i'm returning the data as a byte array -

//Some code that writes the data
return packages.GetAsByteArray();

When I run this code, I expect to see a File Save Dialog in the browser, but nothing happens. There aren't any errors on the C# or JavaScript side. Can anyone tell me what i could be doing wrong?

Was it helpful?

Solution 4

I solved this but forgot to update here -

This worked -

Inside my class -

private const string MimeType = "application/vnd.openxmlformats- 
officedocument.spreadsheetml.sheet";

private ExcelPackage package = new ExcelPackage();

private FileContentResult excelFile;

Write data using EPPlus

 ...

 ...

 ...

excelFile = File(package.GetAsByteArray(), MimeType, FileName);

 return excelFile;

OTHER TIPS

bit late but I was having a similar issue. To solve it I used JSON.stringify(columnValues) on the client to convert my data into a json string before sending it to the controller.

Then instead of using

$.post("/irn/Identifier/Download", { "columnValues": columnValues });

try

var columnValuesString = JSON.stringify(columnvalues);
window.location = '/irn/Identifier/Download?columnvalues=" + columnValuesString';

Changing the $.post() to a window.location makes it work.

Then you can deserialize the json string in the controller and your Open/Save dialog should appear after hitting your link.

I hope this helps someone else. Let me know and I can post my code if needed.

Thanks.

If you're testing the site in Internet Explorer, try the following:

  • Open Internet Options -> Advanced. Click Reset. You can also choose to Restore Advanced Settings.

  • Open Internet Options -> Security. If zones have been changed at all, click "Reset all zones to default level".

Changes to these settings may affect whether or not Internet Explorer accepts file downloads.

More information here: http://answers.microsoft.com/en-us/ie/forum/ie8-windows_other/ie-8-will-not-let-me-download-any-files-music-pdf/bc59ba24-866b-4dbf-93f2-85ebb9912c2c

You should use IFrame to help downlaoding the file.

function postToIframe( url,data) {
    var target = "downloadIFrame";
    $('<iframe  name="' + target + '" style="display:none"/>').appendTo('body');
    $('body').append('<form action="' + url + '" method="post" target="' + target + '" id="postToIframe"></form>');
    $.each(data, function (n, v) {
        $('#postToIframe').append('<textarea name="' + n + '">' + v + '</textarea>');
    });
    $('#postToIframe').submit().remove();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top