【问题标题】:Export object to .xlsx to client machine asp.net core将对象导出到 .xlsx 到客户端机器 asp.net 核心
【发布时间】:2018-06-02 12:40:24
【问题描述】:

我目前正在将对象导出到 .xlsx 文件中。这与我需要的非常接近,Export xlsx in ASP.NET Core ,但问题是 - 这是导出到本地项目文件夹 wwwroot,我想导出到客户端机器。

我试过这个。

   private readonly IHostingEnvironment _hostingEnvironment;

    public ImportExportController(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

    [HttpGet]
    [Route("Export")]
    public FileStreamResult Export()
    {
        string sWebRootFolder = _hostingEnvironment.WebRootPath;
        string sFileName = @"demo.xlsx";
        string URL = string.Format("{0}://{1}/{2}", Request.Scheme, Request.Host, sFileName);
        FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
        if (file.Exists)
        {
            file.Delete();
            file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
        }
        using (ExcelPackage package = new ExcelPackage(file))
        {
            // add a new worksheet to the empty workbook
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Employee");
            //First add the headers
            worksheet.Cells[1, 1].Value = "ID";
            worksheet.Cells[1, 2].Value = "Name";
            worksheet.Cells[1, 3].Value = "Gender";
            worksheet.Cells[1, 4].Value = "Salary (in $)";

            //Add values
            worksheet.Cells["A2"].Value = 1000;
            worksheet.Cells["B2"].Value = "Jon";
            worksheet.Cells["C2"].Value = "M";
            worksheet.Cells["D2"].Value = 5000;

            worksheet.Cells["A3"].Value = 1001;
            worksheet.Cells["B3"].Value = "Graham";
            worksheet.Cells["C3"].Value = "M";
            worksheet.Cells["D3"].Value = 10000;

            worksheet.Cells["A4"].Value = 1002;
            worksheet.Cells["B4"].Value = "Jenny";
            worksheet.Cells["C4"].Value = "F";
            worksheet.Cells["D4"].Value = 5000;

            package.Save(); //Save the workbook.
        }


        FileStream RptStream = new FileStream(Path.Combine(sWebRootFolder, sFileName), FileMode.Open, FileAccess.Read);
        return new FileStreamResult(RptStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    }

但似乎我需要将工作表导出到 wwwroot 文件夹,然后返回带有工作表 url 的文件流结果。而且我不知道如何获取工作表的 url 以传递 filestreamresult 函数。

有人可以帮助我吗? 我想在客户端机器上导出这个 .xlsx 而不是 wwwroot。

【问题讨论】:

  • 我不清楚问题是什么。代码现在在做什么?你想让它做什么呢?
  • 这些代码是将excel工作表导出到wwwroot文件夹,例如。 Export.xlsx,我实际上想导出到客户端机器。

标签: c# asp.net export epplus filestreamresult


【解决方案1】:

尝试将文件写入内存流并让您的方法返回一个 FileContentResult 对象(通过 Controller.File 方法):

var stream = new MemoryStream(package.GetAsByteArray());
return File(stream.ToArray(), "application/vnd.ms-excel", sFileName);

【讨论】:

  • 请问如何修改?
  • @Samsam 用我上面的 sn-p 替换你最后两行代码。
  • 很高兴它正在工作@Samsam 如果这是有效的,请接受这个作为答案
【解决方案2】:

在 asp.net Core 中有一个可以使用的库,名为“EPPlus” 通过添加包管理器控制台“Install-Package EPPlus -Version 4.5.2.1”下载其块,然后在控制器中使用以下代码

每行前面都有一个注释用于描述。

    public async Task<IActionResult>  Export()
    {
        await Task.Yield();

        //Lets we have object userInfo so we will fill it
        var list = new List<UserInfo>()
        {
            new UserInfo { UserName = "catcher", Age = 18 },
            new UserInfo { UserName = "james", Age = 20 },
        };

        // Then use system.IO.MemeoryStream
        var stream = new MemoryStream();

        //Then generate the Sheet by below code "using OfficeOpenXml;" from EPPlus nugget
        using (var package = new ExcelPackage(stream))
        {
            //name the sheet "Sheet1"
            var workSheet = package.Workbook.Worksheets.Add("Sheet1");

            // simple way
            workSheet.Cells.LoadFromCollection(list, true);

            //// mutual
            //workSheet.Row(1).Height = 20;
            //workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            //workSheet.Row(1).Style.Font.Bold = true;
            //workSheet.Cells[1, 1].Value = "No";
            //workSheet.Cells[1, 2].Value = "Name";
            //workSheet.Cells[1, 3].Value = "Age";

            //int recordIndex = 2;
            //foreach (var item in list)
            //{
            //    workSheet.Cells[recordIndex, 1].Value = (recordIndex - 1).ToString();
            //    workSheet.Cells[recordIndex, 2].Value = item.UserName;
            //    workSheet.Cells[recordIndex, 3].Value = item.Age;
            //    recordIndex++;
            //}

            package.Save();
        }
        stream.Position = 0;

        //Name the file which will download
        string excelName = $"UserInfoList-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";

        //Then download 
        return File(stream, "application/octet-stream", excelName);
    }

参考链接 https://www.c-sharpcorner.com/article/using-epplus-to-import-and-export-data-in-asp-net-core/

【讨论】:

  • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 其长期价值,通过展示为什么这是解决问题的好方法,并将使其对有其他类似问题的未来读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
  • 希望我能推荐两次,太有帮助了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多