欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

写一个关于使用NPOI实现一键导出,并在浏览器上面实现下载

程序员文章站 2022-04-24 15:06:33
...

实现效果如下:
写一个关于使用NPOI实现一键导出,并在浏览器上面实现下载
浏览器直接请求我们服务端的文件;
具体步骤:
1.NPOI导入数据库文件,并存在服务器文件夹下面;
2.实现浏览器访问并且请求下载;

实现NPOI存储数据库文件到excel中

 public static void SaveExcel(string fileName,List<orderInfo> orderInfos)
 {
     IWorkbook wb = new HSSFWorkbook();
     ISheet sheet = wb.CreateSheet("订单表");//数据名
     var row = sheet.CreateRow(sheet.LastRowNum);

     //创建标题行
     int i = 0;
     //获取到所有的功能属性,也就是映射list表属性
     PropertyInfo[] propertyInfos = typeof(orderInfo).GetProperties(); //获取其属性名字
     //遍历所有属性
     foreach (var property in propertyInfos)
     {
         object[] obj = property.GetCustomAttributes(typeof(DescriptionAttribute), true); //获取属性里面的注解
         if (obj.Length > 0)
         {
             //创建一列,为起始列
             row.CreateCell(i).SetCellValue(((DescriptionAttribute)obj[0]).Description); //向里面填充属性值
             i++;
         }
     }

     int j = sheet.LastRowNum +1;//用来做创建行的功能,一直往下添加
     int n = 0;//用来给每一列进行赋值操作,用来添加列数
     //给数据填充到表格中
     foreach (var orderInfo in orderInfos)
     {
         n = 0;
         row = sheet.CreateRow(j++);
         //获取每一行的属性值
         var items = orderInfo.GetType().GetProperties();//获取其公共属性
         foreach(var itemPropSub in items)
         {
             //走完以后要从每一行的头开始,进行增加,则要回0;
             var obj = itemPropSub.GetCustomAttributes(typeof(DescriptionAttribute), true);
             if (obj.Length > 0)
             {
                 row.CreateCell(n).SetCellValue(itemPropSub.GetValue(orderInfo, null) == null ? "":
                     itemPropSub.GetValue(orderInfo, null).ToString());//给其添值,如果为空的话就是空值,否则转为字符串写入
                 n++;
             }
         }
     }

     MemoryStream ms = new MemoryStream();
     //创建一个数据流进行数据的保存
     wb.Write(ms);
     ms.Flush();
     ms.Position = 0;//设置流的当前位置
     FileStream fileStream = new FileStream(fileName,FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);//写入数据
     ms.WriteTo(fileStream);
     ms.Close();
     ms.Dispose();
     fileStream.Close();
     wb.Close();
     
 }

数据库内容得先查询并保存到list表中:

public class orderInfo { 
    [Description("订单编号")]
    public string orderId { get; set; }
    [Description("付款时间")]
    public string payTime { get; set; }
    [Description("用户支付状态")]
    public string userPayStatue { get; set; }
    [Description("站点支付状态")]
    public string sitePayStatue { get; set; }
    [Description("所有支付状态")]
    public string allPayStatue { get; set; }
    [Description("快递发货状态")]
    public string expressStatue { get; set; }
}

2.上面实现了保存数据到excel中;

3.实现浏览器请求文件并下载

//这边已经存好数据值了
  var nowTime = DateTime.Now.Ticks.ToString();
   string filePath = context.Server.MapPath("/excelAll/")+System.IO.Path.GetFileName("订单数据表_"+nowTime+".xls");
   SaveExcel(filePath, orderInfos);
   //进行本地的数据流读取
   FileInfo fi = new FileInfo(filePath);
   if (File.Exists(filePath))
   {
       context.Response.Clear();
       context.Response.Buffer = true; //设置<span style="color: rgb(51, 51, 51); line-height: 24px; white-space: pre-wrap;">输出页面是否被缓冲</span>
       context.Response.Charset = "GB2312"; //设置了类型为中文防止乱码的出现 
       context.Response.AppendHeader("Content-Disposition", String.Format("attachment;filename={0}", HttpUtility.UrlEncode("订单数据表_" + nowTime + ".xls"))); //定义输出文件和文件名 
       context.Response.AppendHeader("Content-Length", fi.Length.ToString());
       context.Response.ContentEncoding = Encoding.Default;
       context.Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
       context.Response.WriteFile(fi.FullName);
       context.Response.Flush();
       context.Response.End();
   }

这样子就能实现上面导出的效果了;