Safari添加.html以使用epplus jquery.fileDownload.js下载xlsx

时间:2016-11-09 22:23:54

标签: javascript c# jquery excel model-view-controller

我正在使用MVC c#代码生成excel文件然后下载,我正在使用EPPLUS,一切正常,除了Mac上的Safari,当我尝试创建文件时下载时添加了.html例如,file.xlsx.html 我不知道如何解决这个问题。

    $.fileDownload(url, {
        httpMethod: 'POST',
        data: dtColumns,
        successCallback: function() {
            //code
        },
        failCallback: function() {
            //code

        }
    });

public Stream ExportDataset(IEnumerable数据集,IList columnsToExport,字符串模板)         {             //分组适用于匿名类型,因此我们可以将导出分组到自己的表中             var groupings = dataset.GroupBy(i => i.GetType());

        using (var package = new ExcelPackage(new FileInfo(GetTemplateFilePath(template)), true))
        {
            var ws = package.Workbook.Worksheets[1];

            if (groupings.Any())
            {
                // add each "anon type matched grouping"
                foreach (var grouping in groupings)
                {
                    // because of EPP inheritance bug of T, we can just use dataTable
                    var dataTable = new DataTable(grouping.Key.Name);
                    var properties = grouping.Key.GetProperties(); // Get anon type Properties
                    var columns = columnsToExport.OrderBy(x => x.Position);

                    foreach (var property in columns.Where(column => column.IsVisible).SelectMany(column => properties.Where(property => property.Name.Equals(column.Name))))
                    {
                        dataTable.Columns.Add(property.Name);
                    }

                    foreach (var item in grouping.ToList())
                    {
                        var dataRow = dataTable.NewRow();

                        foreach (var p in columns.Where(column => column.IsVisible).SelectMany(column => properties.Where(property => property.Name.Equals(column.Name))))
                        {
                            dataRow[p.Name] = p.GetValue(item);
                        }

                        dataTable.Rows.Add(dataRow);
                    }

                    ws.Cells[1, 1].LoadFromDataTable(dataTable, PrintHeaders: true);
                    ws.Cells.AutoFitColumns();
                }
            }
            else
            {
                // This case is when there is no data on the table to load the Excel so we create an empty sheet but we add the headers
                var datasetStructure = dataset.GetType().GetGenericArguments()[0];

                // because of EPP inheritance bug of T, we can just use dataTable
                var dataTable = new DataTable(datasetStructure.Name);
                var properties = datasetStructure.GetProperties(); // Get anon type Properties

                foreach (var property in properties)
                {
                    dataTable.Columns.Add(property.Name);
                }

                ws.Cells[1, 1].LoadFromDataTable(dataTable, PrintHeaders: true);
                ws.Cells.AutoFitColumns();
            }

            var fileStream = new MemoryStream();
            package.SaveAs(fileStream);

            return fileStream;
        }
    }
控制器上的

返回新的CustomFileResult(fileStream,fileName);

public class CustomFileResult:IHttpActionResult     {        private readonly Stream _fileContent;        private readonly string _fileName;

    public CustomFileResult(Stream fileContent, string fileName)
    {
       _fileContent = fileContent;
       _fileName = fileName;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.Run(() =>
        {
            var response = new HttpResponseMessage();
            var fileDownloadFail = false;

            if (_fileContent == null || _fileContent.Length == 0)
            {
                response.StatusCode = HttpStatusCode.InternalServerError;
                fileDownloadFail = true;

            }
            else
            {
                response.StatusCode = HttpStatusCode.OK;
                _fileContent.Position = 0;
                response.Content = new StreamContent(_fileContent);

                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = _fileName,
                };
            }

            //Required for plugin jquery.fileDownload.js

            var cookie = new CookieHeaderValue("fileDownload", "true") { Path = "/" };

            response.Headers.AddCookies(new CookieHeaderValue[] { cookie }); 

            return response;

        }, cancellationToken);
    }
}

1 个答案:

答案 0 :(得分:3)

解决方法是在响应中为excel(ContentType)添加标头application/vnd.ms-excel。默认为text/HTML,因此Safari出于这个原因不理解响应包含excel文件,所以添加以下行:

response.Content.Headers.ContentType  = new MediaTypeHeaderValue("application/vnd.ms-excel");
问题解决了。