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 = "將生成的文件保存在指定的目錄名稱";
//由于我們項(xiàng)目上下載Excel文件基本沒(méi)有并發(fā)的情況,所以只用年月日時(shí)分秒來(lái)命名文件就可以避免生成相同文件名文件的問(wèn)題。
string fileSaveName = "下載的文件名稱_" + 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)文章
asp.net 動(dòng)態(tài)生成rdlc報(bào)表(原創(chuàng))
因?yàn)楣拘枨?研究微軟的Reportviewer 因?yàn)橛性S多特別要求所以動(dòng)態(tài)調(diào)用 比較靈活 我的需求是 根據(jù)數(shù)據(jù)不同的合并表頭 (參考了隨心所欲的博客文檔 再次表示感謝)2011-12-12
ASP.NET中動(dòng)態(tài)控制RDLC報(bào)表
ASP.NET中動(dòng)態(tài)控制RDLC報(bào)表...2006-09-09
.net core部署到windows服務(wù)上的完整步驟
這篇文章主要給大家介紹了關(guān)于.net core部署到windows服務(wù)上的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
.Net語(yǔ)言Smobiler開(kāi)發(fā)利用Gridview控件設(shè)計(jì)較復(fù)雜的表單
這篇文章主要為大家詳細(xì)介紹了.Net語(yǔ)言Smobiler開(kāi)發(fā)利用Gridview控件設(shè)計(jì)較復(fù)雜的表單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
.NET的基元類(lèi)型包括什么及Unmanaged和Blittable類(lèi)型詳解
這篇文章主要介紹了.NET的基元類(lèi)型包括什么及Unmanaged和Blittable類(lèi)型詳解,Unmanaged類(lèi)型可以理解不涉及托管對(duì)象引用的值類(lèi)型,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
.net中的session與cookies區(qū)別及使用方法
cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上,cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,考慮到安全應(yīng)當(dāng)使用session2013-04-04
Extjs4.1.x 框架搭建 采用Application動(dòng)態(tài)按需加載MVC各模塊完美實(shí)現(xiàn)
中午的時(shí)候發(fā)了第一篇 Extjs4.1.x 框架搭建 采用Application動(dòng)態(tài)按需加載MVC各模塊,發(fā)現(xiàn)實(shí)現(xiàn)上還是有問(wèn)題,本文將提供詳細(xì)的完美方案2012-11-11
Asp.net中安全退出時(shí)清空Session或Cookie的實(shí)例代碼
網(wǎng)站中點(diǎn)擊退出,如果僅僅是重定向到登錄/出頁(yè)面,此時(shí)在瀏覽器地址欄中輸入登錄后的某個(gè)頁(yè)面地址如主頁(yè),你會(huì)發(fā)現(xiàn)不用登錄就能訪問(wèn),這種退出并不安全了,下面通過(guò)本文給大家介紹安全退出時(shí)清空Session或Cookie的實(shí)例代碼2016-11-11

