Download excel file from page via WebApi call

calendar_today Asked Feb 12, 2013
thumb_up 10 upvotes
history Updated April 16, 2026

Question posted 2013 · +13 upvotes

I’m trying to send a 9MB .xls file as a response from web api controller method. The user will click a button on the page and this will trigger the download via the browser.

Here’s what I’ve got so far but it doesn’t work however it doesn’t throw any exceptions either.

[AcceptVerbs("GET")]
public HttpResponseMessage ExportXls()
{
    try
    {
        byte[] excelData = m_toolsService.ExportToExcelFile();

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new MemoryStream(excelData);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "Data.xls"
        };
        return result;
    }
    catch (Exception ex)
    {
        m_logger.ErrorException("Exception exporting as excel file: ", ex);
        return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
}

Here is the coffeescript/javascript jquery ajax call from a button click in the interface.

$.ajax(
    url: route
    dataType: 'json'
    type: 'GET'
    success: successCallback
    error: errorCallback 
    )

Now that I think about it perhaps the dataType is wrong and shouldn’t be json…

Accepted answer +10 upvotes

I had to make a couple of small changes to get this to work

First: Change the method to a post

[AcceptVerbs("POST")]

Second: Change from using the jQuery ajax lib to use a hidden form, here’s my service function for doing the hidden form and submitting it.

exportExcel: (successCallback) =>
    if $('#hidden-excel-form').length < 1
        $('<form>').attr(
            method: 'POST',
            id: 'hidden-excel-form',
            action: 'api/tools/exportXls'
        ).appendTo('body');

    $('#hidden-excel-form').bind("submit", successCallback)
    $('#hidden-excel-form').submit()

Hopefully there’s a better way to do this but for the time being it’s working and downloading the excel file nicely.

2 code variants in this answer

  • Variant 1 — 1 lines, starts with [AcceptVerbs("POST")]
  • Variant 2 — 10 lines, starts with exportExcel: (successCallback) =>

Top excel Q&A (6)

+10 upvotes ranks this answer #78 out of 167 excel solutions on this site .