【问题标题】:Not able to get excel file from web api dot net core 2.1 using epplus excel package无法使用 epplus excel 包从 web api dot net core 2.1 获取 excel 文件
【发布时间】:2019-03-10 06:43:41
【问题描述】:

我正在尝试在我的 web api 中生成一个 excel 文件/流,并在 HttpResponseMessage 中将其返回,以便在 Angular 5 中将其作为下载提供给客户端。

生成成功,生成一个 xlsx 文件并保存在服务器上,但是当我在 httpResponseMessage 的内容中返回它时,我的浏览器只显示一些 json 而不是整个 excel 文件。

{"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1,"minorRevision":-1},"content":{"headers":[{"key":"Content-Disposition","value":["attachment; filename=636742856488421817.xlsx"]},{"key":"Content-Type","value":["application/ms-excel"]},{"key":"Content-Length","value":["22780"]}]},"statusCode":200,"reasonPhrase":"OK","headers":[],"requestMessage":null,"isSuccessStatusCode":true}

这就是我创建 excel 文件并返回它的方式:

        var dataBytes = File.ReadAllBytes(fileName);
        var dataStream = new MemoryStream(dataBytes);
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK);
        httpResponseMessage.Content = new StreamContent(dataStream);
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
        httpResponseMessage.Content.Headers.ContentLength = dataStream.Length;

【问题讨论】:

  • 您可以尝试使用 Chrome,并将 chrome 收到的内容发送给我们(来自开发工具,F12)吗?
  • 由于您的 excel 已经在磁盘上,您只能这样做(这适用于 webapi 2.1,未在核心上尝试过):return File(fileName, System.Net.Mime.MediaTypeNames.Application.Octet, shortFileName);
  • shortFileName 类似于“report.xlsx”,文件名类似于“c:\report\report.xlsx”。您不必告诉您的客户您的本地完整路径;-)
  • 嗨@DanielBlais,我已经修复了它,并且我使用了与您描述相同的方式。我什至删除了保存,现在我使用 File() 返回流。我面临的问题是我的逻辑不在 Api Controller 中,而是在更深层次的辅助类中。所以 File() 没有工作。然后我更改了帮助程序类中的方法,以将 Stream 而不是 Httpresponsemessage 返回到控制器。在我的控制器中,我使用 File() 将文件返回给客户端。
  • 在 Angular 中我使用 Blob()。请参阅下面的答案以获取完整的解决方案。感谢您抽出宝贵时间 DanielBlais

标签: excel core epplus


【解决方案1】:

我解决了这个问题:

这就是我所做的

创建 excel 包并将其转换为 Stream 的助手类

var fileName = DateTime.Now.Ticks + ".xlsx";
FileInfo file = new FileInfo(fileName);
FileInfo templateFile = new FileInfo(@"Templates/ReportTemplate.xlsx");
ExcelPackage package = new ExcelPackage(file, templateFile);
ExcelWorksheet worksheet = package.Workbook.Worksheets.FirstOrDefault();
... filling rows and cells goed here ...
var dataBytes = package.GetAsByteArray();
Stream dataStream = new MemoryStream(dataBytes);
dataStream.Seek(0, SeekOrigin.Begin);
return dataStream;

在控制器中,我将文件返回给 Angular 客户端,如下所示:

var stream = _helperClass.GenerateReport(exportDate, exportTitle);
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"Report-{DateTime.Now.ToShortDateString()}.xlsx");

在收到响应后,我在 Angular 组件中执行此操作:

var blob = new Blob([res], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
var blobURL = window.URL.createObjectURL(blob);
var anchor = document.createElement("a");
anchor.download = `Report-${new Date().toISOString()}.xlsx`;
anchor.href = blobURL;
anchor.click();

【讨论】:

    【解决方案2】:
    Try this following code:
    
    For conroller:
        [Route("DownLoadExcel")]
        public IActionResult DownLoadExcel()
        {
         var pack = new ExcelPackage();                    
         ExcelWorksheet worksheet = pack.Workbook.Worksheets.Add("sample");
         //First add the headers
         worksheet.Cells[1, 1].Value = "ID";
         worksheet.Cells[1, 2].Value = "Name";                   
    
         //Add values
         worksheet.Cells["A2"].Value = 1000;
         worksheet.Cells["B2"].Value = "Jon";
         return File(pack.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Sample.xlsx");
        }
    
    For client side:
    
        window.open("../.../DownLoadExcel");
    

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 2018-05-30
      • 1970-01-01
      相关资源
      最近更新 更多