2016-11-09 11 views
0

私はMVC c#コードを使用してExcelファイルを生成し、ダウンロードしています。私はEPPLUSを使用しています。例えば、file.xlsx.htmlのように最後に.htmlが追加されたファイルを作成すると、 私はそれをどのように解決できるのか分かりません。Safariでepplus jquery.fileDownload.jsを使用してxlsxをダウンロードする

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

     } 
    }); 

公共ストリームExportDataset(IEnumerableをデータセット、IListのcolumnsToExport、文字列テンプレート) { //グループがアノンタイプで動作しますので、私たちグループ化することができ、自分のテーブル するvarグループ= 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(ファイルストリームファイル名)。

パブリッククラスCustomFileResult:IHttpActionResult { private readonly Stream _fileContent; プライベートreadonly文字列_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); 
    } 
} 
+0

解決策は、応答にコンテンツタイプを追加することです。 – jruiz

答えて

1

そのための解決策は、デフォルトのため、レスポンスに優れてのcontentTypeを追加している理由ドンのためのサファリので、テキスト/ HTMLであり、tは、ファイル応答がエクセルで理解し、その次の行を追加します。

response.Content.Headers.ContentType = new MediaTypeHeaderValue( "application/vnd.ms-excel");

問題は解決しました。

関連する問題