使用MVC 5和WebAPI下载excel文件

时间:2014-03-10 22:04:36

标签: excel angularjs asp.net-web-api breeze asp.net-mvc-5

以下是我正在使用的内容:客户端的AngularJS,BreezeJS。对于服务器,我使用的是Web API和MVC 5.

我一直在寻找如何从服务器构建和检索excel电子表格的方法,但我不知所措。

我发现这个名为linqtocsv的插件有助于从linq构建csv文件。找到了代码项目示例here,找到了nuget链接here

我还发现了有关堆栈流的问题的好用法:Web API HttpResponseMessage content return is incomplete

所以在实现上面的插件--linq到csv之后,并按照上面提到的stackover问题,似乎没有任何工作。

这是我的服务器端代码(均直接来自已提到的链接):

    [HttpPost]
    public HttpResponseMessage DistributorReport(JObject formValues)
    {
        try
        {
            var cqmo = formValues.ToObject<DistributorCQMO>();

            var query = new FindDistributorsByLocationQuery
            {
                States = cqmo.States.Select(x => x.id),
                Cities = cqmo.Cities.Select(x => x.id),
                CitiesExclusion = cqmo.ExcludedCities.Select(x => x.id),
                ZipCodes = cqmo.ZipCodes.Select(x => x.id),
                ZipCodesExclusion = cqmo.ExcludedZipCodes.Select(x => x.id),
                ProductFamily = cqmo.ProductFamily.id,
                ProductSubFamilies = cqmo.ProductSubFamily.Select(x => x.id),
                MatchAllFilter = cqmo.MatchAllFilter,
                ClientTypeFilter = cqmo.ClientTypeFilter
            };



            IEnumerable<DistributorDTO> distributors = this.queryProcessor.Process(query).AsQueryable();

            CsvFileDescription outputFileDescription = new CsvFileDescription
            {
                SeparatorChar = '\t', // tab delimited
                FirstLineHasColumnNames = true
            };


            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new CsvContent<DistributorDTO>(outputFileDescription,
                                                           "ObserverTripList.csv",
                                                            distributors)
            };

            return response;

        }  
        catch (Exception ex)  
        {  
            // logger.ErrorException("Exception exporting as excel file: ", ex);  
            return Request.CreateResponse(HttpStatusCode.InternalServerError);  
        } 
    }

这是辅助类:

public class CsvContent<T> : HttpContent
{
    private readonly MemoryStream _stream = new MemoryStream();
    public CsvContent(CsvFileDescription outputFileDescription, string filename, IEnumerable<T> data)
    {
        var cc = new CsvContext();
        var writer = new StreamWriter(_stream);
        cc.Write(data, writer, outputFileDescription);
        writer.Flush();
        _stream.Position = 0;

        Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        Headers.ContentDisposition.FileName = filename;

    }
    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
    {
        return _stream.CopyToAsync(stream);
    }

    protected override bool TryComputeLength(out long length)
    {
        length = _stream.Length;
        return true;
    }
}

我尝试使用breeze来发布我的帖子,它返回包含在breeze对象中的数据,如果在挖掘返回的对象后,进入它的httpreponse属性,你会看到它的原始形式,标签分隔的数据但是,内容应用程序在application / json中; charset = utf-8而不是excel格式化。

编辑:

我现在有以下工作:

    $.ajax({
        type: 'POST',
        url: 'MappingTool.API/api/Report/DistributorReport',
        data: JSON.stringify(jsonData),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (returnValue) {
            alert("success")
           // window.location = '/Reports/Download?file=' + returnValue;
            }
    });

我得到了正确的回复,并且能够在fiddler和chrome调试器中查看所有结果。但是如何让浏览器自动下载文件?

感谢任何反馈!

编辑:

这是我应该从MVC控制器或API控制器获取的东西吗?似乎有更多支持MVC控制器,比如可以在MVC中使用的FileResult类型;这将给我自动下载:“exporting excel file to view mvc”我看到它使用API​​控制器完成;但是,API控制器不是委托简单数据类型而不是媒体内容的重点吗?

0 个答案:

没有答案