ホームページ >ウェブフロントエンド >htmlチュートリアル >データを EXCEL にエクスポートする MVC の新しい方法: ビューまたは部分ビューを HTML に変換し、FileResult_html/css_WEB-ITnose を直接返します。
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(); } }
これら 2 つのメソッドは、ビューのプレゼンテーションの手順と原則に従って実装されます。 --> ビュー コンテキストをインスタンス化します --> ビューを出力コンテナーに提示します
最後のステップは、EXCEL をエクスポートして FileResult を返す Action メソッドを定義することです。コードは次のとおりです。
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 形式コンテンツをエクスポートするかをビューで直接デザインできます。