【问题标题】:Export to Excel and ModelBase导出到 Excel 和 ModelBase
【发布时间】:2014-07-08 20:46:24
【问题描述】:

我的需求很简单——只需将 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,而只是现有页面上的一个简单操作链接,它显示来自 DB 的数据结果的表格视图。

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

我尝试按照上面的示例并在下面创建了一个 ActionResult,但我不明白我应该用什么代替下面的“ModelBase”,因为它不喜欢这种语法。

        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
           );
    }

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    https://github.com/JellyMaster/ExcelHelper

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

       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 项目。

    【讨论】:

    • Thx,我正在寻找一个简单的解决方案,希望修复几行代码并完成它,但如果没有,我可能最终会研究 NPOI 和您的解决方案。
    • 没问题。我自己正在寻找一个简单的解决方案,并且不需要我进行太多编码即可将数据放入电子表格中,因此是我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多