写一个关于使用NPOI实现一键导出,并在浏览器上面实现下载
程序员文章站
2022-04-24 15:06:33
...
实现效果如下:
浏览器直接请求我们服务端的文件;
具体步骤:
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();
}
这样子就能实现上面导出的效果了;