Asp.net MVC實(shí)現(xiàn)生成Excel并下載功能
本文實(shí)例為大家分享了Asp.net MVC實(shí)現(xiàn)生成Excel并下載的具體代碼,供大家參考,具體內(nèi)容如下
由于項(xiàng)目上的需求,需要導(dǎo)出指定條件的Excel文件。經(jīng)過(guò)一翻折騰終于實(shí)現(xiàn)了。
現(xiàn)在把代碼貼出來(lái)分享
(直接把我們項(xiàng)目里面的一部份輔助類(lèi)的代碼分享一下)
我們項(xiàng)目使用的是Asp.Net MVC4.0模式。
每個(gè)ActionResult必然會(huì)返回一個(gè)View或Json等(View或Json中的參數(shù)都是object類(lèi)型的)
所以我們需要一個(gè)公共類(lèi)來(lái)統(tǒng)一定義操作的“成功或失敗”的狀態(tài)或返回操作的消息 ,以及有利于使用jquery $.get() 、$.post()的接收返回參數(shù)時(shí)的統(tǒng)一性。
以下是StatusMessageData類(lèi)。(當(dāng)然,如果只想要導(dǎo)出Excel,這個(gè)類(lèi)是不需要定義的。)
/// <summary> /// 輔助傳輸StatusMessage數(shù)據(jù) /// </summary> [Serializable] public sealed class StatusMessageData { private StatusMessageType messageType; /// <summary> /// 提示消息類(lèi)別 /// </summary> public StatusMessageType MessageType { get { return messageType; } set { messageType = value; } } private string messageContent = string.Empty; /// <summary> /// 信息內(nèi)容 /// </summary> public string MessageContent { get { return messageContent; } set { messageContent = value; } } private object data; /// <summary> /// 數(shù)據(jù) /// </summary> public object Data { get { return data; } set { data = value; } } /// <summary> /// 構(gòu)造器 /// </summary> /// <param name="messageType">消息類(lèi)型</param> /// <param name="messageContent">消息內(nèi)容</param> public StatusMessageData(StatusMessageType messageType, string messageContent, object data) { this.messageType = messageType; this.messageContent = messageContent; this.data = data; } public StatusMessageData(StatusMessageType messageType, string messageContent) { this.messageType = messageType; this.messageContent = messageContent; } public StatusMessageData() { } } /// <summary> /// 提示消息類(lèi)別 /// </summary> public enum StatusMessageType { /// <summary> /// 成功 /// </summary> Success = 1, /// <summary> /// 錯(cuò)誤 /// </summary> Error = -1, /// <summary> /// 提示信息 /// </summary> Hint = 0, /// <summary> /// 提醒登錄 /// </summary> Login = 5, /// <summary> /// 提示重定向 /// </summary> Redirect = 6, }
在Controller中定義ExportExcel ActionResult
[HttpPost] public ActionResult ExportExcel(SearchModel model) { StatusMessageData result = new StatusMessageData(); if (model.Data == null || model.Data.Count <= 0) { result.MessageType = StatusMessageType.Error; result.MessageContent = "沒(méi)有要下載的數(shù)據(jù)"; return Json(result); } string fileglobal = ""; //組織Excel表格 StringBuilder sb = new StringBuilder(400); sb.Append("<table cellspacing='0' rules='all' border='1'>"); sb.Append("<thead>"); sb.Append("<tr>"); sb.Append("<th>列一</th>"); sb.Append("<th>列二</th>"); sb.Append("<th>列三</th>"); sb.Append("<th>列四</th>"); sb.Append("</tr>"); sb.Append("</thead>"); sb.Append("<tbody>"); try { foreach (var item in model.Data) { sb.Append("<tr>"); sb.Append("<td>"); sb.Append(item.column1); sb.Append("</td>"); sb.Append("<td>"); sb.Append(item.column2); sb.Append("</td>"); sb.Append("<td>"); sb.Append(item.column3); sb.Append("</td>"); sb.Append("<td>"); sb.Append(item.column4); sb.Append("</td>"); sb.Append("</tr>"); } } sb.Append("</tbody>"); sb.Append("</table>"); //以UTF8格式寫(xiě)入文件 byte[] contentBytes = Encoding.UTF8.GetBytes(sb.ToString()); string rootDirServerPath = "將生成的文件保存在指定的目錄名稱(chēng)"; //由于我們項(xiàng)目上下載Excel文件基本沒(méi)有并發(fā)的情況,所以只用年月日時(shí)分秒來(lái)命名文件就可以避免生成相同文件名文件的問(wèn)題。 string fileSaveName = "下載的文件名稱(chēng)_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; string rootDirServerPhysicPath = Server.MapPath("~" + rootDirServerPath); if (!Directory.Exists(rootDirServerPhysicPath)) { Directory.CreateDirectory(rootDirServerPhysicPath); } string[] strFiles = Directory.GetFiles(rootDirServerPhysicPath); if (strFiles.Length > 0) { foreach (string strFile in strFiles) { System.IO.File.Delete(strFile); } } //以下是將文件保存到指定目錄 string userFailedSummaryFileSavePath = rootDirServerPhysicPath + "/" + fileSaveName; if (System.IO.File.Exists(userFailedSummaryFileSavePath)) { System.IO.File.Delete(userFailedSummaryFileSavePath); } System.IO.File.WriteAllBytes(userFailedSummaryFileSavePath, contentBytes); //拼裝好要下載文件的全路徑。 fileglobal = rootDirServerPath + "/" + fileSaveName; } catch (Exception ex) { result.MessageType = StatusMessageType.Error; result.MessageContent = ex.Message.ToString(); return Json(result); } result.MessageType = StatusMessageType.Success; result.MessageContent = "正在下載,請(qǐng)稍候..."; result.Data = fileglobal; return Json(result); }
完成了生成Excel的操作后,在頁(yè)面進(jìn)行異步調(diào)用。
$("#export-excel").click(function (e) { e.preventDefault(); $.post("Controller/ExportExcel.aspx", $("#Form1").serialize(), function (data) { art.dialog.tips(data.MessageContent, 1.5, data.MessageType, function () { if (data.MessageType == 1) { window.open(data.Data); } else { //錯(cuò)誤操作 } }); }); });
以上就是我們項(xiàng)目中關(guān)于Excel生成到下載的全部操作。
考慮的情況比較少,寫(xiě)的比較簡(jiǎn)單。
如果大家有什么好的想法,可以留言,我肯定會(huì)學(xué)習(xí)并實(shí)踐好再拿出來(lái)分享。
非常感謝。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- asp.net 利用NPOI導(dǎo)出Excel通用類(lèi)的方法
- ASP.NET實(shí)現(xiàn)上傳Excel功能
- ASP.NET保存PDF、Word和Excel文件到數(shù)據(jù)庫(kù)
- ASP.NET Core 導(dǎo)入導(dǎo)出Excel xlsx 文件實(shí)例
- ASP.NET MVC使用EPPlus,導(dǎo)出數(shù)據(jù)到Excel中
- asp.net DataTable導(dǎo)出Excel自定義列名的方法
- Asp.net實(shí)現(xiàn)直接在瀏覽器預(yù)覽Word、Excel、PDF、Txt文件(附源碼)
- asp.net實(shí)現(xiàn)導(dǎo)出DataTable數(shù)據(jù)到Word或者Excel的方法
- ASP.Net動(dòng)態(tài)讀取Excel文件最簡(jiǎn)方法
相關(guān)文章
.net?core?中?WebApiClientCore的使用示例代碼
這篇文章主要介紹了.net?core?中?WebApiClientCore的使用示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12ASP.NET如何定時(shí)調(diào)用WebService服務(wù)
在ASP.NET程序中,可以通過(guò)Time組件實(shí)現(xiàn)定時(shí)器功能,但是它與數(shù)據(jù)庫(kù)中的任務(wù)計(jì)劃不一樣,它必須基于程序正在運(yùn)行中才可生效,而數(shù)據(jù)庫(kù)任務(wù)計(jì)劃是不需要基于ASP.NET程序運(yùn)行而執(zhí)行任務(wù)。2015-10-10ASP.NET XmlHttp跨域訪問(wèn)實(shí)現(xiàn)代碼
最近項(xiàng)目需要實(shí)現(xiàn)XmlHttp的POST方法到另一服務(wù)器上的頁(yè)面進(jìn)行數(shù)據(jù)的更新,可是IE會(huì)提出“該頁(yè)正在訪問(wèn)其控制范圍之外的信息,是否繼續(xù)?”等警告信息,而在其他瀏覽器上直接禁止掉,GOOGLE一下原來(lái)是XmlHttp的跨域訪問(wèn)問(wèn)題,找了很多資料,說(shuō)是提供很多解決方案,可是都沒(méi)有用處。2008-11-11ASP.NET中Application和Cache的區(qū)別分析
在asp.net中儲(chǔ)存數(shù)據(jù)的方式有很多,包括application,session,cache, cookie, viewstate。其中application和cache的應(yīng)用范圍,使用方式都比較相似,這里主要對(duì)比一下這兩種方式。2010-03-03ASP.NET讓FileUpload控件支持瀏覽自動(dòng)上傳功能的解決方法
這篇文章主要介紹了ASP.NET讓FileUpload控件支持瀏覽自動(dòng)上傳功能的解決方法,很實(shí)用的技巧,需要的朋友可以參考下2014-07-07.net6?使用Senparc開(kāi)發(fā)小程序配置過(guò)程
這篇文章主要介紹了.net6?使用Senparc開(kāi)發(fā)小程序配置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07使CheckBoxList的Attributes屬性生效(修改微軟的一個(gè)bug)
使CheckBoxList的Attributes屬性生效(修改微軟的一個(gè)bug)...2007-08-08asp.net 繼承自Page實(shí)現(xiàn)統(tǒng)一頁(yè)面驗(yàn)證與錯(cuò)誤處理
一直以來(lái),我都在思考以前一個(gè)項(xiàng)目中,后臺(tái)文件中很多的.aspx文件上的權(quán)限判斷問(wèn)題,傻乎乎的我基本上每個(gè)文件當(dāng)時(shí)都給加了一句2009-04-04