在WebAPI中以返回HttpResponseMessage作为Excel文件的问题

我创build了WebAPI,它使用closedxml nuget返回一个excel文件。 基本上它将我的DataTable转换为Excel。 我指的是下面的几个链接,

  1. 如何在ASP.NET WebAPI中返回一个文件(FileContentResult)

  2. 在ASP.NET Web API中从控制器返回二进制文件

问题:在服务器path上生成的excel没有问题。 但是,当我通过webAPI将它作为HttpResponseMessage返回时下载相同的Excel文件已损坏。 它说,“该文件已损坏,无法打开”:(

在这里输入图像说明

我的代码:

  [System.Web.Http.AcceptVerbs("GET", "POST")] public HttpResponseMessage ExportExcel() { DataTable scoredRecords = Getdt(); if (scoredRecords.Rows.Count > 0) { var path = @"C:\Raghav\asdf.xlsx"; XLWorkbook wb = new XLWorkbook(); wb.Worksheets.Add(scoredRecords, "sample"); // excel getting generated on server properly-No issues. wb.SaveAs(path); HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); var stream = new FileStream(path, FileMode.Open); result.Content = new StreamContent(stream); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "sample.xlsx" }; result.Content.Headers.ContentLength = stream.Length; //tried with "application/ms-excel" also result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); return result; } } 

生成的excel在服务器上没有问题。 只有通过webAPI下载的excel文件被损坏。 无法找出问题..任何帮助赞赏! 🙂

尝试这个:

  [HttpGet] public HttpResponseMessage Export() { using (var wb = new XLWorkbook()) using (MemoryStream ms = new MemoryStream()) { wb.Worksheets.Add("sample").FirstCell().SetValue("some value"); wb.SaveAs(ms); HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new ByteArrayContent(ms.GetBuffer()); result.Content.Headers.ContentLength = ms.Length; result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "sample.xlsx" }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); return result; } } 

我看到的一个问题是:

  var stream = new FileStream(path, FileMode.Open); 

你正在发送FileStream。 而不是这个,你可以尝试使用byte []

 byte[] excelData = File.ReadAllBytes(path); result.Content = new StreamContent(excelData); 

你可以试试这个。