本文共 3902 字,大约阅读时间需要 13 分钟。
导出EXCEL方法总结
MVC导出数据到EXCEL的方法有很多种,常见的是:
1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可;
优点:可设置丰富的EXCEL格式,缺点:需要依赖EXCEL组件,且EXCEL进程在服务器中无法及时关闭,以及服务器上会存留大量的不必要的XLS文件;
2.设置输出头为:application/ms-excel,再输出拼接的HTML TABLE数据;
优点:无需组件,可设置一些简单的格式,缺点:拼接HTML TABLE过程较复杂,不够直观;
3.借助第三方组件(如:NPOI)
优点及缺点均依赖于第三方组件的易用性上面,在此不作说明;
大家也可以看我之前发表的一篇博文:
实现在MVC下新的导出EXCEL方法
这里给大家分享一个在MVC下的新方法:将视图或分部视图转换为HTML后再直接返回FileResult即可轻松实现导出EXCEL功能,下面直接上代码。
首先看一下分部视图(IndexDataList)的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | @model IEnumerable< CCPS.Models.Data.CustomerCommentInfo > @using PagedList.Mvc; < table > < thead > < tr > < th >意见ID</ th > < th >组 织</ th > < th >车牌</ th > < th >车型</ th > < th >皇家版</ th > < th >客户</ th > < th >客户电话</ th > < th >责任部门</ th > < th >责任班组</ th > < th >业务顾问</ th > < th >意见类型</ th > < th >状态</ th > < th >录入员</ th > < th >录入时间</ th > </ tr > </ thead > < tbody id="list-table-body"> @foreach (var item in Model) { string className = ""; if (item.Status == "已审核未处理") { className = "uncl_yellow"; if (item.AuditDatetime != null && DateTime.Now > ((DateTime)item.AuditDatetime).AddHours(24)) { className = "uncl_red"; } } < tr class="@className" data-adt="@item.AuditDatetime"> < td >< a href="http://oa.pfcn.com/flow/fl_ui_main.aspx?ID=@item.Id&flow_id=147" target="_blank">@item.Id</ a ></ td > < td >@item.OrgName</ td > < td >@item.PlateNo</ td > < td >@item.Model</ td > < td >@item.IsRoyalVer</ td > < td >@item.CustomerName</ td > < td >@item.CustomerPhoneNo</ td > < td >@item.RelevantDept</ td > < td >@item.RelevantGroup</ td > < td >@item.Consultant</ td > < td >@item.Type</ td > < td >@item.Status</ td > < td >@item.CreateBy</ td > < td >@string.Format("{0:g}", item.CreateDatetime)</ td > </ tr > } </ tbody > </ table > @if(true!=ViewBag.NoPaging) { < div class="pager"> @Html.PagedListPager(Model as PagedList.IPagedList< CCPS.Models.Data.CustomerCommentInfo >, page => string.Format("javascript:turnPage({0});", page), PagedListRenderOptions.ClassicPlusFirstAndLast) </ div > } |
我这里的分部视图不仅仅只是为了导出EXCEL用,在搭配主视图显示数据时照样可以可以用,所以我这里有是否分页判断,如果导出EXCEL,那肯定就不需要分页了。
下面是实现将视图、分部视图生成HTML的方法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [NonAction] protected string RenderViewToString(Controller controller, string viewName, string masterName) { IView view = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, masterName).View; using (StringWriter writer = new StringWriter()) { ViewContext viewContext = new ViewContext(controller.ControllerContext, view, controller.ViewData, controller.TempData, writer); viewContext.View.Render(viewContext, writer); return writer.ToString(); } } [NonAction] protected string RenderPartialViewToString(Controller controller, string partialViewName) { IView view = ViewEngines.Engines.FindPartialView(controller.ControllerContext, partialViewName).View; using (StringWriter writer = new StringWriter()) { ViewContext viewContext = new ViewContext(controller.ControllerContext, view, controller.ViewData, controller.TempData, writer); viewContext.View.Render(viewContext, writer); return writer.ToString(); } } |
这两个方法是按照其视图呈现的步骤与原理来实现的,一般步骤是:找到视图-->实例化视图上下文-->呈现视图到输出容器
最后就是定义一个导出EXCEL的Action方法,并返回FileResult,这样就完成了导出EXCEL功能,代码如下:
1 2 3 4 5 6 7 8 | public ActionResult Export(DataFilter<CustomerCommentInfo>[] filters) { var resultList = DataProvider.GetCustomerCommentInfos(filters).OrderBy(t => t.CreateDatetime); ViewBag.NoPaging = true ; ViewData.Model = resultList; string viewHtml = RenderPartialViewToString( this , "IndexDataList" ); return File(System.Text.Encoding.UTF8.GetBytes(viewHtml), "application/ms-excel" , string .Format( "ccpi_{0}.xls" , Guid.NewGuid())); } |
是不是很简单呢?想要导出什么样的EXCEL格式内容,直接可以在视图中设计好就可以了。
本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4846076.html ,如需转载请自行联系原作者