文章出處

導出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)的內容:

@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的方法,代碼如下:

        [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功能,代碼如下:

        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格式內容,直接可以在視圖中設計好就可以了。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()