使用EPPlus创建Excel文件后如何下载

16

我正在使用EPPlus库生成一个Excel文件,我已经成功将其保存在服务器上的文件夹中。

如何将此文件下载到我的本地计算机?

这是我的代码:

public void CreateExcelFirstTemplate()
{   
   var fileName = "C:\ExcelDataTest\ExcellData.xlsx";
   var file = new FileInfo(fileName);
   using (var package = new OfficeOpenXml.ExcelPackage(file))
   {
      var worksheet = package.Workbook.Worksheets.FirstOrDefault(x => x.Name == "Attempts");
      worksheet = package.Workbook.Worksheets.Add("Assessment Attempts");
      worksheet.Row(1).Height = 20;

      worksheet.TabColor = Color.Gold;
      worksheet.DefaultRowHeight = 12;
      worksheet.Row(1).Height = 20;

      worksheet.Cells[1, 1].Value = "Employee Number";
      worksheet.Cells[1, 2].Value = "Course Code";

      var cells = worksheet.Cells["A1:J1"];
      var rowCounter = 2;
      foreach (var v in userAssessmentsData)
      {
        worksheet.Cells[rowCounter, 1].Value = v.CompanyNumber;
        worksheet.Cells[rowCounter, 2].Value = v.CourseCode;

        rowCounter++;
      }
      worksheet.Column(1).AutoFit();
      worksheet.Column(2).AutoFit();


      package.Workbook.Properties.Title = "Attempts";
      package.Save();
  }
}

您想将此文件保存在服务器上还是每次用户请求下载时仅生成该文件? - Alex Art.
我想在用户请求下载时每次生成文件。 - Arianule
4个回答

27

如果您在每个请求时生成此文件,则不需要将其保存在服务器上:

public void CreateExcelFirstTemplate()
{
       var fileName = "ExcellData.xlsx";
       using (var package = new OfficeOpenXml.ExcelPackage(fileName))
       {
          var worksheet = package.Workbook.Worksheets.FirstOrDefault(x => x.Name == "Attempts");
          worksheet = package.Workbook.Worksheets.Add("Assessment Attempts");
          worksheet.Row(1).Height = 20;

          worksheet.TabColor = Color.Gold;
          worksheet.DefaultRowHeight = 12;
          worksheet.Row(1).Height = 20;

          worksheet.Cells[1, 1].Value = "Employee Number";
          worksheet.Cells[1, 2].Value = "Course Code";

          var cells = worksheet.Cells["A1:J1"];
          var rowCounter = 2;
          foreach (var v in userAssessmentsData)
          {
            worksheet.Cells[rowCounter, 1].Value = v.CompanyNumber;
            worksheet.Cells[rowCounter, 2].Value = v.CourseCode;

            rowCounter++;
          }
          worksheet.Column(1).AutoFit();
          worksheet.Column(2).AutoFit();


          package.Workbook.Properties.Title = "Attempts";
          this.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
          this.Response.AddHeader(
                    "content-disposition",
                    string.Format("attachment;  filename={0}", "ExcellData.xlsx"));
          this.Response.BinaryWrite(package.GetAsByteArray());
      }
}         

1
我正在使用你们提供的示例代码。但是我是通过ajax调用它,当我执行它时,它会进入ajax错误,并且无法下载Excel文件。提前致谢。 - Prasad Joshi
1
你不需要使用ajax来下载文件,可以使用常规的get/post方法。由于我们设置了Content-Disposition头部,浏览器会正确地处理响应(下载附件)。你可以在这里阅读有关此头部的更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition - Alex Art.
“Response” 的声明在哪里?你使用了 this.Response 但没有声明。 - jefmaus
我通过这种方法下载的文件充满了奇怪的加密字符,例如PK�UU�H��3。有什么想法吗?完整描述在这里:https://dev59.com/eXgPtIcB2Jgan1znddIW - RaZzLe

10

你可以使用 package.GetAsByteArray() 而不是使用 package.Save(),它会返回一个字节数组,然后您可以使用MVC操作中的FileResultFileContentResult将其流式传输以触发文件下载。此方法可让您直接下载文件而无需先保存到服务器。


2

以下是下载文件的示例操作。您可以根据需要自由修改它。

public FileActionResult DownloadMyFile()
{
    var filePath = "C:\ExcelDataTest\ExcellData.xlsx";
    var fileName = "ExcellData.xlsx";
    var mimeType = "application/vnd.ms-excel";
    return File(new FileStream(filePath, FileMode.Open),mimeType, fileName);
}  

application/vnd.ms-excel is the MIME type for xls files, not xlsx - Panagiotis Kanavos

1
你可以这样做:
excel.Workbook.Properties.Title = "Attempts";
this.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
this.Response.AddHeader("content-disposition",string.Format("attachment;  filename={0}", "ExcellData.xlsx"));
this.Response.BinaryWrite(excel.GetAsByteArray());

更多详细内容请查看博客:http://sforsuresh.in/generating-and-formatting-excelsheet-in-c-using-epplus/


“Response” 的声明在哪里?你使用了 this.Response 但没有声明。 - jefmaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接