【问题标题】:trying to export to excel with epplus core and .net core尝试使用 epplus 核心和 .net 核心导出到 excel
【发布时间】:2017-04-08 03:37:13
【问题描述】:

我正在尝试导出到 excel 按钮,当它被点击时我想调用这个 api 并下载一个 excel 表。

我的控制器代码看起来像这样,老实说我被卡住了,因为我不确定我应该返回什么。我是 .net core api 的新手,抱歉

[Route("api/excel")]
public class ExportToExcel : Controller
{
    private readonly ScadaContext _context;

    public ExportToExcel(ScadaContext context)
    {
        _context = context;
    }

    // GET: api/values
    [HttpGet]
    public ActionResult GetExcelMainView()
    {
        var query = _context.Main_View.Where(x => !x.MeterId.StartsWith("HOGC"));
        List<Object[]> MainViewList = new List<Object[]>();
        foreach(var p in query)
        {
            MainViewList.Add(new Object[] { "Battery Voltage", p.BatteryVoltage });
        }
        MemoryStream stream = new MemoryStream();
        using (ExcelPackage pck = new ExcelPackage(stream)) 
        {
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add("MainView");
            ws.Cells["A1"].LoadFromArrays(MainViewList);
            Response.Clear();
            Response.Headers.Add("content-disposition", "attachment;  filename=Clients.xlsx");
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            var bytes = pck.GetAsByteArray();
            Response.Body.WriteAsync(bytes, 0, bytes.Length);
        }
    }
}

【问题讨论】:

    标签: excel asp.net-core asp.net-web-api2 single-page-application epplus


    【解决方案1】:

    使用FileResult 子类之一的最简单方法, 比如FileStreamResult

    控制器方法File(stream,...,...)为你做:

    return File(stream, contentTypeString, willbeSavedWithThisFileName);
    

    应该可以工作。我不确定你是否必须再次将你的包重新“包装”到内存流中

    var streamagain = new MemoryStream(package.GetAsByteArray());
    

    (使用您已经编写的“手动”代码,我会尝试return StatusCode(200) 作为将您的内容返回给客户端的方式)。

    【讨论】:

    • 我尝试添加 return StatsusCode(200) 它尝试下载 excel 表,但它总是说网络错误失败。我去调试,我实际上并没有看到网络路径去服务器然后回来
    • 然后忘记这一点并使用return File(stream,......)?无论如何,它是更少的代码。这很好。
    • 所以保留我所有的代码但返回 File(stream, contentType 这是什么意思?
    • 不要将代码的最后四行(直接编辑响应)替换为一行,return File(stream, contentTypeString, willbeSavedWithThisFileName);
    • 感谢您的建议,我真的不知道该怎么做。它旋转了大约 20 分钟,然后发回 502 错误网关。如果我能从调试器中理解,我正在尝试调试它
    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 2018-06-30
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2017-06-25
    相关资源
    最近更新 更多