2017-01-19 27 views
1

ClosedXMLライブラリを使用してExcelファイルを返すWebAPIを作成しようとしています。WebAPIからExcelファイルを返します。ASPNetCore

FileStreamResultを返すと、うまくいきます。しかし、Web API Return A Fileで議論したようにHttpResponseMessageに変更した場合、ファイルをダウンロードしたり、コンテンツを見たり、JSON文字列を取得することができませんでした。

このHttpResponseMessageからファイルコンテンツをどのように抽出できるかを知りたいと思います。

は、私はブラウザや郵便配達のツールでテストし、私は戻って得たすべてはJSON文字列:この1は

[HttpGet("ERSheet2")] 
     public HttpResponseMessage ER_GenerateWBLWorksheet2() 
     { 
      MemoryStream stream = new MemoryStream(); 
      var workbook = new XLWorkbook(); 

      var SheetNames = new List<string>() { "15-16", "16-17", "17-18", "18-19", "19-20" }; 

      foreach (var sheetname in SheetNames) 
      { 
       var worksheet = workbook.Worksheets.Add(sheetname); 

       worksheet.Cell("A1").Value = sheetname; 
      } 

      workbook.SaveAs(stream); 
      stream.Seek(0, SeekOrigin.Begin); 

      HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
      result.Content = new ByteArrayContent(stream.ToArray()); 
      result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
      result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
      result.Content.Headers.ContentDisposition.FileName = "ERSheet.xlsx"; 
      return result; 
     } 

更新

{ 
     "version": { 
     "major": 1, 
     "minor": 1, 
     "build": -1, 
     "revision": -1, 
     "majorRevision": -1, 
     "minorRevision": -1 
     }, 
     "content": { 
     "headers": [ 
      { 
      "key": "Content-Disposition", 
      "value": [ 
       "attachment; filename=ERSheet.xlsx" 
      ] 
      }, 
      { 
      "key": "Content-Type", 
      "value": [ 
       "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
      ] 
      } 
     ] 
     }, 
     "statusCode": 200, 
     "reasonPhrase": "OK", 
     "headers": [], 
     "requestMessage": null, 
     "isSuccessStatusCode": true 
    } 

マイコードは以下の通りですこの質問Download file with ClosedXMLとは違って、私はすでに 'FileStreamResult'を使って動作させていると言いました。私はこのコメントのためにこれを要求しています。 "StreamContentでHttpResponseMessageを返す方が良い"このスレッドで作られたWeb API Return A File。したがって、.Net CoreでHttpResponseMessageを使用しようとしていて、Darinの答えとしてサポートされていないことは分かりませんでした。

+0

このResponseMessageにはコンテンツがありません。私はExcelファイルの内容を意味します。または私は正しくないですか? – Marusyk

+0

申し訳ありませんが、私は混乱しています。私のResponseMessageにはコンテンツが含まれていないか、HttpResponseMessageを使用してコンテンツを保持することはできません。 – TTCG

+0

[ClosedXMLでファイルをダウンロードする](0120-18753-03) – Marusyk

答えて

2

.NETコアで実行されているASP.NET Web APIは、HttpResponseMessageをサポートしていません。したがって、基本的には、JSONに戻すこのオブジェクトのインスタンスを(あなたの単純なビューモデルであるかのように)シリアル化しようとします。そこには、使用することができたいくつかcompatibility shim hacksがありますが、一般的に、私はより多くの慣用的なアプローチを使用して、あなたをお勧めします - あなたの行動からIActionResultインスタンスを返す:

[HttpGet("ERSheet2")] 
public IActionResult ER_GenerateWBLWorksheet2() 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     var workbook = new XLWorkbook(); 

     var SheetNames = new List<string>() { "15-16", "16-17", "17-18", "18-19", "19-20" }; 

     foreach (var sheetname in SheetNames) 
     { 
      var worksheet = workbook.Worksheets.Add(sheetname); 

      worksheet.Cell("A1").Value = sheetname; 
     } 

     workbook.SaveAs(stream); 
     stream.Seek(0, SeekOrigin.Begin); 

     return this.File(
      fileContents: stream.ToArray(), 
      contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 

      // By setting a file download name the framework will 
      // automatically add the attachment Content-Disposition header 
      fileDownloadName: "ERSheet.xlsx" 
     ); 
    } 
} 
+0

ええ、それは主な理由でなければならない。私は別の答えでこの行のHttpResponse cozでそれを返そうとしています。 "HttpResponseMessageをStreamContentで内部に返す方が良い。"ありがとう。 – TTCG

+1

はい、この回答は、.NETコアではなく、完全な.NETフレームワーク上で実行されているASP.NET Web APIに関するものです。 –

+0

質問が.NetコアまたはStandard .Netに関連しているかどうかをどのように確認しますか?これらのハッシュタグはページのどこにも見つかりませんでした。 – TTCG

0

私はあなたが使用する必要があると考えている。

response.Contentを= new ByteArrayContent(stream.GetBuffer());

しかし、これをAngular2で使用するには問題があります。 Angular1で動作します。

+0

この答えがどのように関係するかは不明です。問題はAngularの使用については言及していません。しかし、私は何かを見て、Askerが質問を明確にするのを助けることができますか? – matt2000

関連する問題