本文實(shí)例為大家分享了Asp.net MVC實(shí)現(xiàn)生成Excel并下載的具體代碼,供大家參考,具體內(nèi)容如下
由于項(xiàng)目上的需求,需要導(dǎo)出指定條件的Excel文件。經(jīng)過一翻折騰終于實(shí)現(xiàn)了。
現(xiàn)在把代碼貼出來分享
(直接把我們項(xiàng)目里面的一部份輔助類的代碼分享一下)
我們項(xiàng)目使用的是Asp.Net MVC4.0模式。
每個ActionResult必然會返回一個View或Json等(View或Json中的參數(shù)都是object類型的)
所以我們需要一個公共類來統(tǒng)一定義操作的“成功或失敗”的狀態(tài)或返回操作的消息 ,以及有利于使用jquery $.get() 、$.post()的接收返回參數(shù)時的統(tǒng)一性。
以下是StatusMessageData類。(當(dāng)然,如果只想要導(dǎo)出Excel,這個類是不需要定義的。)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/// <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> /// 信息內(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">消息類型</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> /// 提示消息類別 /// </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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
[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 = "將生成的文件保存在指定的目錄名稱" ; //由于我們項(xiàng)目上下載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的操作后,在頁面進(jìn)行異步調(diào)用。
1
2
3
4
5
6
7
8
9
10
11
12
|
$( "#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 { //錯誤操作 } }); }); }); |
以上就是我們項(xiàng)目中關(guān)于Excel生成到下載的全部操作。
考慮的情況比較少,寫的比較簡單。
如果大家有什么好的想法,可以留言,我肯定會學(xué)習(xí)并實(shí)踐好再拿出來分享。
非常感謝。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/sheldon-blog/archive/2017/12/22/8086010.html