EPPlus - 保存在内存中创建的 Excel 并在 Excel 上打开它会出现错误

Bru*_*Pro 5 c# excel epplus asp.net-web-api asp.net-core

目标是在内存中创建一个 excel 文件,并使用 ASP.Net Core 中内置的 API 将其下载到浏览器中,但是将 excel 保存为流并将其转换为字节数组,然后在 excel (Office 365版本 1803)给出错误: Excel 错误 代码字节数组:

public IActionResult Export()
{
    byte[] bytes;
    MemoryStream stream = new MemoryStream();
    using (ExcelPackage package = new ExcelPackage(stream))
    {
        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;
        bytes = package.GetAsByteArray();
    }
    return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "test.xlsx");
}
Run Code Online (Sandbox Code Playgroud)

更新:添加了内存流示例

代码内存流:

public IActionResult Export()
{
    using (ExcelPackage package = new ExcelPackage())
    {
        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;
        var stream = new MemoryStream(package.GetAsByteArray());

        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "test.xlsx");
    }
}
Run Code Online (Sandbox Code Playgroud)

更新 2:使用 .net core 2.1 创建了一个新项目,代码可以正常工作。这似乎是一个与项目相关的错误,不知何故请求的内容正在被操纵。将调查导致问题的原因并发布其解决方案。

pfx*_*pfx 4

package.Stream我使用而不是实现了类似的场景package.GetAsByteArray
(最后一个对我来说也失败了。)

请注意package.Save我在您的代码中错过的内容。
GetAsByteArray即使使用 ,也会失败Package.Save。)

public IActionResult Export()
{
    MemoryStream content = new MemoryStream(); // Gets disposed by FileStreamResult.        
    using (ExcelPackage package = new ExcelPackage(content))
    {
        // Code to create the content goes here.

        package.Save();
    }

    content.Position = 0;

    return new FileStreamResult(content, "application/octet-stream") { 
        FileDownloadName = "test.xlsx"
        };            
}  
Run Code Online (Sandbox Code Playgroud)