asp.net mvc导出excel文件先保存到服务器某个目录,然后再导出到客户端供客户下载功能的实现

时间:2021-03-12 17:52:25

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