前段时间我写了一篇有关导入导出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(); }