导出到Excel和ModelBase

时间:2014-07-08 20:46:24

标签: asp.net-mvc-4 entity-framework-5 export-to-excel export-to-csv

我的需求很简单 - 只需将MVC视图数据表导出到Excel即可。 我搜索了许多不同的方法将Razor MVC4视图导出到Excel并发现这是一个很好的简单方法,但我对如何正确实现它有点困惑,因为我不了解ModelBase概念。我发现了一些使用这种方法的例子,但无法让他们使用我的解决方案。

http://landokal.wordpress.com/2011/04/28/asp-net-mvc-export-to-excel-trick/

   public class ExcelResult<Model> : ActionResult
{
    string _fileName;
    string _viewPath;
    Model _model;
    ControllerContext _context;

    public ExcelResult(ControllerContext context, string viewPath, string fileName, Model model)
    {
        this._context = context;
        this._fileName = fileName;
        this._viewPath = viewPath;
        this._model = model;
    }
    protected string RenderViewToString()
    {
        using (var writer = new StringWriter())
        {
            var view = new WebFormView(_context, _viewPath);
            var vdd = new ViewDataDictionary<Model>(_model);
            var viewCxt = new ViewContext(_context, view, vdd, new TempDataDictionary(), writer);
            viewCxt.View.Render(viewCxt, writer);
            return writer.ToString();
        }
    }
    void WriteFile(string content)
    {
        HttpContext context = HttpContext.Current;
        context.Response.Clear();
        context.Response.AddHeader("content-disposition", "attachment;filename=\"" + _fileName + "\"");
        context.Response.Charset = "";
        context.Response.ContentType = "application/ms-excel";
        context.Response.Write(content);
        context.Response.End();
    }

    public override void ExecuteResult(ControllerContext context)
    {
        string content = this.RenderViewToString();
        this.WriteFile(content);
    }
}

我也使用相同的方法发现了这个类似的帖子。 Excel Result not giving me anything, but it runs fine

我没有像上面那样使用AJAX,而只是现有页面上的一个简单的actionlink,它显示了来自DB的数据结果的表格视图。

@Html.ActionLink("Export to Excel", "ExcelExport")

我试着按照上面的例子在下面创建了一个ActionResult,但我不明白我想要用什么代替&#34; ModelBase&#34;下面因为它不喜欢这种语法。

        public ActionResult ExcelExport()
    {
       List<TrainingSwipe> viewModel = _db.TrainingSwipes
            .OrderBy(v => v.SwipeDateTime).ToList();
       return View(viewModel);
       return new ExcelResult<ModelBase>
           (
               ControllerContext,
               "Export.aspx",
               "ExcelExport",
               viewModel
           );
    }

1 个答案:

答案 0 :(得分:0)

我最近在我的MVC项目中做了很多Excel导出,并且一直在使用NPOI的excel包。替代品是EP Plus,我认为它是建立在NPOI的顶部(我自己没有使用过)

对于ModelBase我不完全确定那是什么我怀疑是博客创建的一些抽象类,但这里有一个可能的解决方案。

但我离题了。我已经构建了一个简单的ExcelHelper类,它将NPOI内容包装在底层以执行所有Excel创建,然后您只需将文件作为FileResult返回。

您可以在此处访问该项目:

https://github.com/JellyMaster/ExcelHelper

如果您查看单元测试,您将看到它是如何工作的。但就在动作结果中使用它而言,这里有一些示例代码。

   public ActionResult Export()
        {
            List<MyModel> model = new List<MyModel>();

            MemoryStream stream = new MemoryStream();

            model = myServiceLayer.GetExportResults();

            DataSet ds = new DataSet();
            ds.Tables.Add(model.ToDataTable<MyModel>());

            try
            {
                stream = ExcelHelper.CreateExcelSheet(ds, ExcelHelper.ExcelType.Xlsx);
            }
            catch (Exception error)
            {
                ModelState.AddModelError("", error);
            }



            if (!ModelState.IsValid)
            {
                return View();
            }
            else
            {
                string exportName = "myexcelfile.xlsx";

                return File(stream.ToArray(), "application/vnd.ms-excel", exportName);
            }



        }

这可以通过做一些反射来将类对象转换为数据集,然后将该数据导出到数据集中,该数据集被送入excelhelper并将内容输出到流中,然后将其作为文件结果传回。

我实际上需要推出一个更新,它解决了我发现的几个小问题但它在当前形式下工作得非常好。如果您需要更多信息或帮助,请随时与我们联系。

编辑:我实际上只是将更新推送到我的github项目。