MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

简介:

导出EXCEL方法总结

MVC导出数据到EXCEL的方法有很多种,常见的是:

1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可;

优点:可设置丰富的EXCEL格式,缺点:需要依赖EXCEL组件,且EXCEL进程在服务器中无法及时关闭,以及服务器上会存留大量的不必要的XLS文件;

2.设置输出头为:application/ms-excel,再输出拼接的HTML TABLE数据;

优点:无需组件,可设置一些简单的格式,缺点:拼接HTML TABLE过程较复杂,不够直观;

3.借助第三方组件(如:NPOI)

优点及缺点均依赖于第三方组件的易用性上面,在此不作说明;

大家也可以看我之前发表的一篇博文:我写的一个ExcelHelper通用类,可用于读取或生成数据

实现在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  ,如需转载请自行联系原作者

相关文章
|
3月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
本文介绍了Twaver HTML5中数据的批量加载方法,通过使用`box.startBatch()`可以在大量数据加载时提高性能。文章通过示例代码展示了如何在React组件中使用批量加载功能,以减少界面重绘次数并提升效率。
62 2
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
51 1
|
8天前
|
数据采集 前端开发 数据挖掘
利用 html_table 函数轻松获取网页中的表格数据
本文介绍了如何使用 R 语言中的 `html_table` 函数结合代理 IP 技术,轻松提取网页表格数据并规避反爬机制。通过设置代理和请求头,示例代码展示了如何从 58 同城采集租房信息并保存为 CSV 文件。该方法适用于需要频繁采集数据的场景,确保数据采集的高效和稳定性。
利用 html_table 函数轻松获取网页中的表格数据
|
1月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
121 1
|
3月前
|
数据可视化 前端开发
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
本文介绍了如何在Twaver-HTML5中使用鹰眼(Overview)可视化视图组件,它作为Network的缩略图,允许用户通过缩略图导航Network,支持单击、双击和框选操作来控制Network视图。
51 5
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
|
3月前
Twaver-HTML5基础学习(35)Network中ToolTip显示Chart(视图未成功出现)
本文尝试在Twaver-HTML5的Network组件的ToolTip中显示echarts饼图,但未成功,可能与版本有关。
48 4
Twaver-HTML5基础学习(35)Network中ToolTip显示Chart(视图未成功出现)
|
3月前
|
数据可视化 前端开发 容器
Twaver-HTML5基础学习(41)列表可视化视图组件(List)
本文介绍了如何在Twaver-HTML5中使用列表可视化视图组件(List),展示了如何创建列表、设置列表属性(如行高、间隔颜色等)、实现数据绑定和排序,以及如何通过React代码示例进行操作。
44 2
Twaver-HTML5基础学习(41)列表可视化视图组件(List)
|
3月前
Twaver-HTML5基础学习(30)监听事件_network绘制监听_network视图操作监听_鼠标事件的监听
本文介绍了如何在Twaver-HTML5中监听网络视图操作事件,包括视图绘制、鼠标事件以及获取鼠标下的网元等。
48 1
Twaver-HTML5基础学习(30)监听事件_network绘制监听_network视图操作监听_鼠标事件的监听
|
3月前
|
XML 移动开发 JSON
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
本文介绍了Twaver HTML5中的数据容器(DataBox),包括如何进行增删查改操作、遍历数据容器以及判断网元是否存在于数据容器中。DataBox用于管理所有的网元对象,如ElementBox、LayerBox、AlarmBox等,并通过示例代码展示了其常用方法的使用。
50 1
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
|
3月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(2)基本数据元素(Data)
本文介绍了Twaver HTML5中的基本数据元素,包括Data、Element、Alarm和Layer等,它们分别用来描述拓扑的网元、告警和图层。文章详细解释了Data类的基本属性和方法,并提供了如何在React组件中使用Twaver创建节点和连线的示例代码。
49 1
Twaver-HTML5基础学习(2)基本数据元素(Data)