【问题标题】:How to download .xslx File from server using EPPlus and MVC如何在 MVC 中使用 EPPlus 从服务器下载 .xlsx 文件
【发布时间】:2013-10-04 19:19:26
【问题描述】:

我有一个使用 EPPlus 在服务器上生成的 Excel 文件,该文件是正确制作的,并且使用 window.location 在本地计算机上工作正常,但在部署到服务器时什么也不做。我正在尝试通过 MVC 控制器返回 FileStreamResult,但我认为它不起作用。我正在使用 ajax 调用来访问控制器方法,但是在运行该方法时它无法进入 .done。

我一直在查看 ASP.NET MVC EPPlus Download Excel File 以获取我的 C# 参考。

脚本

 function exportToExcel() {
    var batchName = $("#batchDateSelect option:selected").text();
    var bID = $("#batchDateSelect").val();
    var params = {
        BatchID: bID,
        BatchName: batchName
    };
    $.post(path + "Export/ExportToExcel", params)
    .done(function (Data, textStatus, jqXHR) {
        var fileName = "";

        ////window.location = path + "ExportFiles/"+fileName;
    });

}

控制器

public ActionResult ExportToExcel(int BatchID,string BatchName)
{

    FileStreamResult FSR = DataAccess.ExportUtility.CreateExcelFile(BatchID, BatchName);

    return FSR;

}

EPPlus 方法

public static FileStreamResult CreateExcelFile(int batchid,string batchName)
    {

        string fileName = batchName + " Reason_Code_Export.xlsx";
        var serverPath = HttpContext.Current.Server.MapPath("~/ExportFiles/");
        DirectoryInfo outputDir = new DirectoryInfo(serverPath);

        FileInfo newfile = new FileInfo(outputDir.FullName + fileName);
        if (newfile.Exists)
        {
            newfile.Delete();
            newfile = new FileInfo(outputDir.FullName + fileName);
        }
        Dictionary<string,int> MAData = PolicyDataAccess.GetMatchActionData(batchid);
        MemoryStream MS = new MemoryStream();
        using (ExcelPackage package = new ExcelPackage(newfile))
        {
            ..........
            ........

            package.SaveAs(MS);
        }
        MS.Position = 0;
        var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        FileStreamResult FSR = new FileStreamResult(MS, contentType);
        FSR.FileDownloadName = fileName;



        return FSR;
    }

获取该文件的最简单方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc excel download epplus


    【解决方案1】:

    这个问题我迟到了,但可能对其他人有帮助。

    在您设置了 excel 工作表后,不保存或将其添加到 MemoryStream,只需将字节数组设为 packge.GetAsByteArray() 并从您的操作中返回它作为文件而不是 FileStreamResult

    var FileBytesArray = packge.GetAsByteArray();
    return File(FileBytesArray, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename + ".xlsx");
    

    【讨论】:

      【解决方案2】:

         EPPLUS 让我非常头疼。
      而且我对 MVC 不是很熟悉,但我假设您想按照直接写入输出响应的方式做一些事情。在这种情况下,我会使用类似下面的内容。
      我看到我在 cmets 中留下了内存流写入也可以工作的情况。这更接近您要求做的事情,但我目前没有在我的代码中使用它。所以买家要小心。

      .干杯。

              Response.Clear();
              Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
      
              Response.AddHeader( "Content-Disposition", "attachment; filename=ProposalRequest-" + fileName + ".xslx" );
              Response.BinaryWrite( pck.GetAsByteArray() );
              // myMemoryStream.WriteTo(Response.OutputStream); //works too
              Response.Flush();
              Response.Close();
      

      【讨论】:

      • 谢谢,这有助于解决使用 epplus 编辑模板时与“损坏”文件相关的问题
      【解决方案3】:

      DougY 发布的答案可能效果很好,但是在他发布之前我确实找到了解决方案。

      我不会将此标记为已回答,因为我确信有更好的方法,如果有人想发布或评论什么是最好的方法,那么我会标记答案。

      感谢道格的回复

      控制器的两种方法可能可以组合,但这就是它最终的结果。

      控制器

      public static string ContentType { get; set; }
      public static string FilePath { get; set; }
      public static string FileName { get; set; }
      public static byte[] Bytes { get; set; }
      
      public void ExportToExcel(int BatchID,string BatchName)//is called first to set the variables
          {
              string contentType;
              byte[] bytes;
              string ret = DataAccess.ExportUtility.CreateExcelFile(BatchID, BatchName,out contentType, out bytes);
              ContentType = contentType;
              Bytes = bytes;
      
              FileName = ret[1];
      
      
      
      
          }
          public ActionResult DownloadExcelFile()//is then called to download the file
          {
      
              return File(Bytes, ContentType, FileName);
      
          }
      

      ExportUtility 类

      public static string[] CreateExcelFile(int batchid,string batchName,out string ContentType, out byte[] Bytes)
          {
      
              string fileName = batchName + " Reason_Code_Export.xlsx";
      
              var serverPath = HttpContext.Current.Server.MapPath("~/ExportFiles/");
              DirectoryInfo outputDir = new DirectoryInfo(serverPath);
              byte[] bytes;
              FileInfo newfile = new FileInfo(outputDir.FullName + fileName);
              if (newfile.Exists)
              {
                  newfile.Delete();
                  newfile = new FileInfo(outputDir.FullName + fileName);
              }
              Dictionary<string,int> MAData = PolicyDataAccess.GetMatchActionData(batchid);
              MemoryStream MS = new MemoryStream();
              ExcelPackage package;
              using (package = new ExcelPackage(newfile))
              {
                  ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(batchName);
      
                  worksheet.Cells["A1"].Value = batchName + " Reason_Code_Export";
                  worksheet.Cells["A1"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
                  worksheet.Cells["A1:B1"].Merge = true;
                  worksheet.Cells["A1:B1"].Style.Font.Bold = true;
      
                  worksheet.Cells["A2"].Value = "Reason Code";
                  worksheet.Cells["B2"].Value = "Number of Reason Codes Selected";
                  worksheet.Cells["A2:B2"].Style.Font.Bold = true;
                  int row = 3;
                  int col = 1;
                  foreach (KeyValuePair<string,int> MA in MAData)
                  {
                      worksheet.Cells[row, col].Value = MA.Key;
                      worksheet.Cells[row, col + 1].Value = MA.Value;
                      row++;
      
                  }
                  worksheet.Column(1).Width = 34.29;
                  worksheet.Column(2).Width = 34.29;
      
                  package.Workbook.Properties.Title = batchName + " Reason_Code_Export";
                  package.Workbook.Properties.Author = "Intranet Application: Unclaimed Properties";
                  package.Workbook.Properties.Company = "Assurity Life 2013";
                  Bytes = package.GetAsByteArray();
                  //package.SaveAs(newfile);//MS);
      
              }
              MS.Position = 0;
              var rl = serverPath + fileName;
              var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
              ContentType = contentType;
              FileStreamResult FSR = new FileStreamResult(MS, contentType);
              FSR.FileDownloadName = fileName;
              string[] ret = new string[2];
              ret[0] = serverPath;
              ret[1] = fileName;
      
      
              return ret;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        相关资源
        最近更新 更多