Asp.net MVC实现生成Excel并下载功能
本文实例为大家分享了Asp.netMVC实现生成Excel并下载的具体代码,供大家参考,具体内容如下
由于项目上的需求,需要导出指定条件的Excel文件。经过一翻折腾终于实现了。
现在把代码贴出来分享
(直接把我们项目里面的一部份辅助类的代码分享一下)
我们项目使用的是Asp.NetMVC4.0模式。
每个ActionResult必然会返回一个View或Json等(View或Json中的参数都是object类型的)
所以我们需要一个公共类来统一定义操作的“成功或失败”的状态或返回操作的消息,以及有利于使用jquery$.get()、$.post()的接收返回参数时的统一性。
以下是StatusMessageData类。(当然,如果只想要导出Excel,这个类是不需要定义的。)
//////辅助传输StatusMessage数据 /// [Serializable] publicsealedclassStatusMessageData { privateStatusMessageTypemessageType; //////提示消息类别 /// publicStatusMessageTypeMessageType { get{returnmessageType;} set{messageType=value;} } privatestringmessageContent=string.Empty; //////信息内容 /// publicstringMessageContent { get{returnmessageContent;} set{messageContent=value;} } privateobjectdata; //////数据 /// publicobjectData { get{returndata;} set{data=value;} } //////构造器 /// ///消息类型 /// 消息内容 publicStatusMessageData(StatusMessageTypemessageType,stringmessageContent,objectdata) { this.messageType=messageType; this.messageContent=messageContent; this.data=data; } publicStatusMessageData(StatusMessageTypemessageType,stringmessageContent) { this.messageType=messageType; this.messageContent=messageContent; } publicStatusMessageData() { } } /// ///提示消息类别 /// publicenumStatusMessageType { //////成功 /// Success=1, //////错误 /// Error=-1, //////提示信息 /// Hint=0, //////提醒登录 /// Login=5, //////提示重定向 /// Redirect=6, }
在Controller中定义ExportExcelActionResult
[HttpPost]
publicActionResultExportExcel(SearchModelmodel)
{
StatusMessageDataresult=newStatusMessageData();
if(model.Data==null||model.Data.Count<=0)
{
result.MessageType=StatusMessageType.Error;
result.MessageContent="没有要下载的数据";
returnJson(result);
}
stringfileglobal="";
//组织Excel表格
StringBuildersb=newStringBuilder(400);
sb.Append("");
sb.Append("");
sb.Append("");
sb.Append("列一 ");
sb.Append("列二 ");
sb.Append("列三 ");
sb.Append("列四 ");
sb.Append(" ");
sb.Append("");
sb.Append("");
try
{
foreach(variteminmodel.Data)
{
sb.Append("");
sb.Append("");
sb.Append(item.column1);
sb.Append(" ");
sb.Append("");
sb.Append(item.column2);
sb.Append(" ");
sb.Append("");
sb.Append(item.column3);
sb.Append(" ");
sb.Append("");
sb.Append(item.column4);
sb.Append(" ");
sb.Append(" ");
}
}
sb.Append("");
sb.Append("");
//以UTF8格式写入文件
byte[]contentBytes=Encoding.UTF8.GetBytes(sb.ToString());
stringrootDirServerPath="将生成的文件保存在指定的目录名称";
//由于我们项目上下载Excel文件基本没有并发的情况,所以只用年月日时分秒来命名文件就可以避免生成相同文件名文件的问题。
stringfileSaveName="下载的文件名称_"+DateTime.Now.ToString("yyyyMMddHHmmss")+".xls";
stringrootDirServerPhysicPath=Server.MapPath("~"+rootDirServerPath);
if(!Directory.Exists(rootDirServerPhysicPath))
{
Directory.CreateDirectory(rootDirServerPhysicPath);
}
string[]strFiles=Directory.GetFiles(rootDirServerPhysicPath);
if(strFiles.Length>0)
{
foreach(stringstrFileinstrFiles)
{
System.IO.File.Delete(strFile);
}
}
//以下是将文件保存到指定目录
stringuserFailedSummaryFileSavePath=rootDirServerPhysicPath+"/"+fileSaveName;
if(System.IO.File.Exists(userFailedSummaryFileSavePath))
{
System.IO.File.Delete(userFailedSummaryFileSavePath);
}
System.IO.File.WriteAllBytes(userFailedSummaryFileSavePath,contentBytes);
//拼装好要下载文件的全路径。
fileglobal=rootDirServerPath+"/"+fileSaveName;
}
catch(Exceptionex)
{
result.MessageType=StatusMessageType.Error;
result.MessageContent=ex.Message.ToString();
returnJson(result);
}
result.MessageType=StatusMessageType.Success;
result.MessageContent="正在下载,请稍候...";
result.Data=fileglobal;
returnJson(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生成到下载的全部操作。
考虑的情况比较少,写的比较简单。
如果大家有什么好的想法,可以留言,我肯定会学习并实践好再拿出来分享。
非常感谢。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。