Asp.net MVC實現(xiàn)生成Excel并下載功能
本文實例為大家分享了Asp.net MVC實現(xiàn)生成Excel并下載的具體代碼,供大家參考,具體內容如下
由于項目上的需求,需要導出指定條件的Excel文件。經過一翻折騰終于實現(xiàn)了。
現(xiàn)在把代碼貼出來分享
(直接把我們項目里面的一部份輔助類的代碼分享一下)
我們項目使用的是Asp.Net MVC4.0模式。
每個ActionResult必然會返回一個View或Json等(View或Json中的參數(shù)都是object類型的)
所以我們需要一個公共類來統(tǒng)一定義操作的“成功或失敗”的狀態(tài)或返回操作的消息 ,以及有利于使用jquery $.get() 、$.post()的接收返回參數(shù)時的統(tǒng)一性。
以下是StatusMessageData類。(當然,如果只想要導出Excel,這個類是不需要定義的。)
/// <summary>
/// 輔助傳輸StatusMessage數(shù)據(jù)
/// </summary>
[Serializable]
public sealed class StatusMessageData
{
private StatusMessageType messageType;
/// <summary>
/// 提示消息類別
/// </summary>
public StatusMessageType MessageType
{
get { return messageType; }
set { messageType = value; }
}
private string messageContent = string.Empty;
/// <summary>
/// 信息內容
/// </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>
/// 構造器
/// </summary>
/// <param name="messageType">消息類型</param>
/// <param name="messageContent">消息內容</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>
/// 提示消息類別
/// </summary>
public enum StatusMessageType
{
/// <summary>
/// 成功
/// </summary>
Success = 1,
/// <summary>
/// 錯誤
/// </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 = "沒有要下載的數(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格式寫入文件
byte[] contentBytes = Encoding.UTF8.GetBytes(sb.ToString());
string rootDirServerPath = "將生成的文件保存在指定的目錄名稱";
//由于我們項目上下載Excel文件基本沒有并發(fā)的情況,所以只用年月日時分秒來命名文件就可以避免生成相同文件名文件的問題。
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 = "正在下載,請稍候...";
result.Data = fileglobal;
return Json(result);
}
完成了生成Excel的操作后,在頁面進行異步調用。
$("#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 {
//錯誤操作
}
});
});
});
以上就是我們項目中關于Excel生成到下載的全部操作。
考慮的情況比較少,寫的比較簡單。
如果大家有什么好的想法,可以留言,我肯定會學習并實踐好再拿出來分享。
非常感謝。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- asp.net 利用NPOI導出Excel通用類的方法
- ASP.NET實現(xiàn)上傳Excel功能
- ASP.NET保存PDF、Word和Excel文件到數(shù)據(jù)庫
- ASP.NET Core 導入導出Excel xlsx 文件實例
- ASP.NET MVC使用EPPlus,導出數(shù)據(jù)到Excel中
- asp.net DataTable導出Excel自定義列名的方法
- Asp.net實現(xiàn)直接在瀏覽器預覽Word、Excel、PDF、Txt文件(附源碼)
- asp.net實現(xiàn)導出DataTable數(shù)據(jù)到Word或者Excel的方法
- ASP.Net動態(tài)讀取Excel文件最簡方法
相關文章
asp.net 動態(tài)生成rdlc報表(原創(chuàng))
因為公司需求 研究微軟的Reportviewer 因為有許多特別要求所以動態(tài)調用 比較靈活 我的需求是 根據(jù)數(shù)據(jù)不同的合并表頭 (參考了隨心所欲的博客文檔 再次表示感謝)2011-12-12
.Net語言Smobiler開發(fā)利用Gridview控件設計較復雜的表單
這篇文章主要為大家詳細介紹了.Net語言Smobiler開發(fā)利用Gridview控件設計較復雜的表單,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
.NET的基元類型包括什么及Unmanaged和Blittable類型詳解
這篇文章主要介紹了.NET的基元類型包括什么及Unmanaged和Blittable類型詳解,Unmanaged類型可以理解不涉及托管對象引用的值類型,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-06-06
.net中的session與cookies區(qū)別及使用方法
cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務器上,cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙,考慮到安全應當使用session2013-04-04
Extjs4.1.x 框架搭建 采用Application動態(tài)按需加載MVC各模塊完美實現(xiàn)
中午的時候發(fā)了第一篇 Extjs4.1.x 框架搭建 采用Application動態(tài)按需加載MVC各模塊,發(fā)現(xiàn)實現(xiàn)上還是有問題,本文將提供詳細的完美方案2012-11-11
Asp.net中安全退出時清空Session或Cookie的實例代碼
網(wǎng)站中點擊退出,如果僅僅是重定向到登錄/出頁面,此時在瀏覽器地址欄中輸入登錄后的某個頁面地址如主頁,你會發(fā)現(xiàn)不用登錄就能訪問,這種退出并不安全了,下面通過本文給大家介紹安全退出時清空Session或Cookie的實例代碼2016-11-11

