2016-09-02 17 views
1

WebAPIからExcelファイルをダウンロードしようとしています。基本的にExcelファイルはメモリストリーム経由で作成されています。PostWebAPI/MVCでExcelファイルをダウンロード

Excelコンテンツはうまく生成されていますが、Chromeネットワークツールの[レスポンス]タブにレスポンス自体が純粋なXMLとしてダウンロードできません。以下はC#のコードです

var sheet = linq.ExportToExcel(userAddedList);

  var stream = new MemoryStream(); 
      var sw = new StreamWriter(stream); 
      sw.Write(sheet); 
      sw.Flush(); 

      var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(stream.GetBuffer()) }; 
      result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Report.xml" }; 
      result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel"); 

      var response = ResponseMessage(result); 
      return response; 

これは私がAngularから呼び出す方法です。

var httpRequest = commonFunctions.getRequestObject( "GET"、requestURL、{}、null);

 $http(httpRequest).then(function (response) { 
      vm.isProcessing = false; 
     }, function (error) { displayError(error); }); 
+1

あなたはXMLの拡張子を指定して、設定していますコンテンツタイプをBIFFバージョンのExcelに追加します。結果として、あなたは正確に何を期待していますか?私はhttp://stackoverflow.com/a/4212908/534109 –

+0

@ TiesonTを見ていきます。私が言及したように、私はちょうどその記事の例に従った。とにかく、あなたが提案したように、私はxlsとMIMEタイプの拡張をapplication/vnd.ms-excelに変更しました。 AJAXのリクエストがなければ正常に動作しますが、AJAXで動作させる方法を知りたいのですが – programmerboy

答えて

1

あなたがターゲットとしているブラウザは、あなたがBlob objectを使用することができ、ファイルのAPIをサポートしている場合。ここでは、this fiddleから取られ、機能に包まれ、次のとおりです。

var setFile = function(data, fileName, fileType) { 
    // Set objects for file generation. 
    var blob, url, a, extension; 

    // Get time stamp for fileName. 
    var stamp = new Date().getTime(); 

    // Set MIME type and encoding. 
    fileType = (fileType || "text/csv;charset=UTF-8"); 
    extension = fileType.split("/")[1].split(";")[0]; 
    // Set file name. 
    fileName = (fileName || "ActiveVoice_" + stamp + "." + extension); 

    // Set data on blob. 
    blob = new Blob([ data ], { type: fileType }); 

    // Set view. 
    if (blob) { 
     // Read blob. 
     url = window.URL.createObjectURL(blob); 

     // Create link. 
     a = document.createElement("a"); 
     // Set link on DOM. 
     document.body.appendChild(a); 
     // Set link's visibility. 
     a.style = "display: none"; 
     // Set href on link. 
     a.href = url; 
     // Set file name on link. 
     a.download = fileName; 

     // Trigger click of link. 
     a.click(); 

     // Clear. 
     window.URL.revokeObjectURL(url); 
    } else { 
     // Handle error. 
    } 
}; 

あなたはこのようなあなたのコードの一部としてそれを使用します。

$http(httpRequest).then(function (response) { 
    vm.isProcessing = false; 
    setFile(response.data, "Report.xls", "application/ms-excel"); 
}, function (error) { displayError(error); }); 
+0

OPに* 'research/google for javascript solution' *を提供し、サードパーティのライブラリデモへのリンクを提供するだけではありません完全な応答も答えもありません。これはコメントだったはずです。 – Jeeped

+0

@Jeeped - より具体的な答えを更新しました。 – mlhDev

関連する問題