[ASP.NET MVC] 匯出 .csv 檔案
常見的匯出檔案有 .pdf .xls .ods .csv,下面筆記最簡單的 .csv 檔,可用常見的 Microsoft Office Excel 或 LibreOffice Calc 等報表軟體開啟:
產生檔案下載
Controller 可以用 return File(); 來做到檔案下載,引數分別為 byte[] 的檔案內容,string 表示的檔案類型和 string 下載後檔案名稱,而 byte[] 類型可用 System.Text.Encoding.Default.GetBytes() 方法來獲得位元組序列,以下為名稱 Demo 的 Controller 程式碼:
using System.Text; namespace prjMVC.Controllers { public class DemoController : Controller { public ActionResult GetFiles(string output) { string fileName = "output.txt"; // 存成檔名 byte[] fileContent = Encoding.Default.GetBytes(output); // 轉成位元組序列 return File(fileContent, "text/plain", fileName); } } }
以上 Action 在瀏覽器輸入 ~/Demo/GetFiles?output=xxxx 的網址,或是 View 中有 @Html.ActionLink("下載", "GetFiles", new { output = "xxxx" }) 產生的超連結被點擊時,瀏覽器就會下載一個文字檔案 output.txt:
下面就是傳入 output 字串 "測試文字" 得到的下載文字檔案:
列出清單結果
這個部份不是產生匯出檔案必要的,但是通常是先在網頁有呈現結果,再提供匯出檔案的功能,所以我也把這個部份做出來。而且因為網頁呈現與匯出檔案都需要一樣的資料,所以我先在 ~/Service 資料夾增加一個SEmployee.cs 類別檔案,負青處理列出資料的邏輯,以下為 SEmployee.cs 的程式碼:
using System.Collections.Generic; using System.Linq; using prjMVC.Models; namespace prjMVC.Service { public class SEmployee { dbTestEntity db = new dbTestEntity(); public List<Employee> QueryAll() { return db.Employee.ToList(); // 用 EntityFramework 取得所有員工資料 } } }
而 DemoController 中有一個網頁呈現用的 Action List 和準備匯出檔案用的 Action Output:
using System.Collections.Generic; using System.Linq; using prjMVC.Models; using prjMVC.Service; namespace prjMVC.Controllers { public class DemoController : Controller { SEmployee service = new SEmployee(); public ActionResult List() { List<Employee> result = service.QueryAll(); return View(result) ; // 將查詢的員工資料傳給 View } [HttpPost] public ActionResult OutputCSV() { return View(); // 暫時這樣寫,等下改寫成 return File(); } } }
而 List 的 View 中除了 foreach 遍歷所有資料放入 <table> 中,還有一個 <input type="submit"> 的 button 來提供匯出 .csv 檔案:
@model IEnumerable<prjMVC.Models.Employee> @{ ViewBag.Title = "List"; } <h2>List</h2> <p> @Html.ActionLink("Create New", "Create") </p> @using (Html.BeginForm("OutputCSV","Demo")) // Post 去 OutputCSV 這個 Action { @Html.TextBox("btn", "匯出檔案", new { @class= "btn btn-success", type="submit" }) } <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Name) </th> <th> @Html.DisplayNameFor(model => model.Salary) </th> <th></th> </tr> @foreach (var item in Model) { // 遍歷資料 <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.Salary) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | @Html.ActionLink("Details", "Details", new { id=item.Id }) | @Html.ActionLink("Delete", "Delete", new { id=item.Id }) </td> </tr> } </table>
以上 View 的結果是:
點擊那個「匯出檔案」按鈕要產生 .csv 檔案並下載,接下來來看 OutputCSV() 的內容。
匯出 .csv 檔案
在匯出前先看 .csv 是怎麼一回事,使用記事本打開會發現,其實也就是用逗點和斷行字元做出來的純文字檔案:
其實他只是文字檔案,這樣方向就很簡單了,我們可以使用 StringBuilder 物件將 List<Employee> 資料串出字串,然後讓 Controller 以 return File() 回傳,就可以下載檔案,以下是 Controller 內的 OutputCSV Action 的程式碼:
using System.Text; using prjMvc.Service; namespace prjMVC.Controllers { public class DemoController : Controller { SEmployee service = new SEmployee(); [HttpPost] public ActionResult OutputCSV() { List<Employee> qryResult = service.QueryAll(); StringBuilder sb = new StringBuilder(); sb.AppendLine("姓名,薪水"); // .csv 的第一列標題 foreach(Employee emp in qryResult) { sb.AppendLine($"{emp.Name},{emp.Salary}"); } string fileName = "薪水.csv"; // 存成檔名 byte[] fileContent = Encoding.Default.GetBytes(sb.ToString()); return File(fileContent, "text/plain", fileName); } } }
在點擊「匯出檔案」按鈕後瀏覽器就會下載一份 .csv 檔案到資料夾中。
留言
張貼留言