前段时间我写了一篇有关导入导出excel表的博文,这篇博文关于导出excel表部分是利用的asp.net mvc的FileResult直接导出excel表供客户下载的。最近又接到一个新需求,领导要求生成的excel先保存到服务器端,供以后备查,然后再导出。这样的话原来的excel导出方法就不适用了。经过查资料及大量的测试,终于找到一可行的方法。
public FileResult ExportMemberInfoToExcel()
{
var list = TempData["ListMember"] as List<MemberAndPasswordViewModel>;
var fileName = "MemberInfo" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
var strRows = new StringBuilder();
strRows.Append("<table><tr>");
strRows.Append("<td style=\"mso-number-format:\\@;\">编号</td>");
strRows.Append("<td style=\"mso-number-format:\\@;\">登录名</td>");
strRows.Append("<td style=\"mso-number-format:\\@;\">密码</td>");
strRows.Append("</tr>");
foreach (var item in list)
{
strRows.Append("<tr>");
strRows.Append("<td style=\"mso-number-format:\\@;\">" + item.Id + "</td>");
strRows.Append("<td style=\"mso-number-format:\\@;\">" + item.UserName + "</td>");
strRows.Append("<td style=\"mso-number-format:\\@;\">" + item.Password + "</td>");
strRows.Append("</tr>");
}
strRows.Append("</table>");
var result = strRows.ToString();
//生成字节数组
var fileContents = Encoding.Default.GetBytes(result);
//设置excel保存到服务器的路径
var filePath = Server.MapPath("~/gall/excel/" + fileName + ".xls");
//保存excel到指定路径
FileManager.WriteBuffToFile(fileContents, filePath);
//读取已有的excel文件输出到客户端供客户下载该excel文件
return File(filePath, "application/ms-excel", fileName+".xls");
}
前面生成fileContents字节数组的方法与原来导出excel博文的写法基本没什么区别,主要是增加了保存文件到服务器的一个目录的方法。这里使用了FileManager类下的一个WriteBuffToFile方法,及自已有的服务器端excel文件读取excel输出客户端的语句。
WriteBuffToFile的代码如下:
/// <summary>
/// 写字节数组到文件
/// </summary>
/// <param name="buff"></param>
/// <param name="filePath"></param>
public static void WriteBuffToFile(byte[] buff, string filePath)
{
WriteBuffToFile(buff, 0, buff.Length, filePath);
}
/// <summary>
/// 写字节数组到文件
/// </summary>
/// <param name="buff"></param>
/// <param name="offset">开始位置</param>
/// <param name="len"></param>
/// <param name="filePath"></param>
public static void WriteBuffToFile(byte[] buff, int offset, int len, string filePath)
{
string directoryName = Path.GetDirectoryName(filePath);
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
FileStream output = new FileStream(filePath, FileMode.Create, FileAccess.Write);
BinaryWriter writer = new BinaryWriter(output);
writer.Write(buff, offset, len);
writer.Flush();
writer.Close();
output.Close();
}