导出本页数据

  • Post author:
  • Post category:其他


下面是我最近学习的,导出本页显示数据的方法

要导出数据,首先要先把数据查询出来,这里查询方法我就不多写了,写完查询后,在你控制的查询方法下面写上下面这段代码

在这里插入图片描述

如上图所示,写在你查询方法return Json的上面,先清空limit和page,然后再把limit和GetStartIndex存到Session里,limit是每页数量,GetStartIndex是分页开始序号

然后接着写导出本页都方法

先在页面写个点击事件

function 自定义点击事件名(){


//然后这里获取当前表格数据的筛选条件

var 自定义下拉框名 = $(“#下拉框id “).val();

//后面根据你的条件数依次写……

var 自定义文本框名 = $(”#文本框id “).val();

//然后这里写判断它是否为空

if (自定义下拉框名 == “” || 自定义下拉框名 == undefined) {


ID = 0; }

//这里也是根据上面的依次在后面写

……

if (自定义文本框名 == undefined) {


自定义文本框名 = “”}

//这里再接着输出一下,询问用户是否导出,如果是就输出后面的function回调函数,layer是调用的layui插件的弹出层

layer.confirm(“询问语句”, { icon: 3, title: “提示” }, function (layerIndex) {


layer.close(layerIndex);

//根据上面的筛选条件在后面依次写参数

window.open(“控制器写的自定义导出方法名?根据上面的筛选条件依次写的参数); });}

然后再到控制器写打印本页的方法

public ActionResult 自定义导出方法名(int id参数, ……string 文本框参数) {


//然后在这里把上面的limit和page强制转换为int32类型

int page = Convert.ToInt32(Session[“page”]);

int limit = Convert.ToInt32(Session[“limit”]);

//然后这里紧接着写查询数据

List<自定义类的类名或者表名> 自定义列表名A = (from 自定义的表名1 in Model对象.连接的表1

join 自定义的表名 in Model对象.连接的表2 on 连接的表1.(连接的条件,对应ID值) equals 连接的表2.(连接的条件,对应ID值)

连接的表3 on 连接的表2.(连接的条件,对应ID值) equals 连接的表3.(连接的条件,对应ID值) (主外键相连)

orderby tbEmployee.EmployeeID descending(排序)

select new 自定义类的类名 {


类的属性1 = 自定义的表名.字段1,

类的属性2 = 自定义的表名.字段2,

类的属性3 = 自定义的表名.字段3,

……

}).Single();查询单条数据,当没有数据或者有多条数据时会触发异常

.ToList();查询多条数据并转为List

.Count();查询有多少条数据

//然后这里写条件筛选 Lambda表达式 运算符=>,左边是参数(如果有),右边是表达式或者语句

if (参数> 0) {


自定义列表名A = 自定义列表名A.Where(m => m.对应id ==对应id).ToList();}

if (参数2> 0) {


自定义列表名A = 自定义列表名A.Where(m => m.对应id ==对应id).ToList();}

if (!string.IsNullOrEmpty(文本框)) {


自定义列表名A = 自定义列表名A.Where(m => m.文本框里面写的数据.Contains(文本框id) || m.文本框里写的数据.Contains(文本框id)).ToList();}

//条件筛选之后在这里写分页数据

int totalRow = linqBarrier.Count();//计算数据总条数

//获取分页数据,调用上面转成int类型的page和limit

List<自定义类的类名或者表名> 自定义名B = 自定义A

.Skip(page)

.Take(limit)

.ToList();

//然后这里接着写创建Excel工作簿

HSSFWorkbook 自定义工作簿名 = new HSSFWorkbook();

//然后这里再接着创建工作表,这里的NPOI是插件,NPOI就是在你没有安装office的时候可以读取Excel和word文档。创建表用ISheet,Sheet就是创建工作表的名字

NPOI.SS.UserModel.ISheet 自定义工作表名 = 自定义工作簿名.CreateSheet(“工作表的名字”);

//然后再接着创建表头行,创建行用IRow,0就表示第一行

NPOI.SS.UserModel.IRow 自定义表头行名A = 自定义工作表名.CreateRow(0);

//再接着设置表头,CreateCell是索引,SetCellValue设置表头行的值,需要多少就创建多少

自定义表头行名A.CreateCell(0).SetCellValue(“表头名字”);

自定义表头行名A.CreateCell(1).SetCellValue(“表头名字”);

自定义表头行名A.CreateCell(2).SetCellValue(“表头名字”);

……

//然后再接着for循环把数据一条一条的写到Excel表格

for (int i = 0; i < 上面的自定义名B.Count(); i++)

{


//创建行,这里的自定义行名不要和上面的重复

NPOI.SS.UserModel.IRow 自定义行名B = 自定义工作表名.CreateRow(i + 1);

//然后添加数据,这里的数据根据表头的数据名依次写

自定义行名B.CreateCell(0).SetCellValue(自定义名B [i].对应数据名);

自定义行名B.CreateCell(1).SetCellValue(自定义名B [i].对应数据名);

自定义行名B.CreateCell(2).SetCellValue(自定义名B [i].对应数据名);

自定义行名B.CreateCell(3).SetCellValue(自定义名B [i].对应数据名);

……

}

//然后再接着为Excel文件命名,DateTime再文件名后加上时间,yyyy-MM-dd-HH-mm-ss-ffff表示年月日时分秒毫秒

        string 自定义文件名 = "文件名" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + "文件后缀";
        //这里是创建一个内存流来保存二进制数组                        MemoryStream 自定义内存流名 = new MemoryStream();
        //这里将Excel文件写入内存流
        自定义工作簿名.Write(自定义内存流名);
        //输出之前调用Seek(偏移量,游标位置) 移动文件读取指针到指定的位置
        //Seek(0,Seek.begin) 第一个参数表示相对位置,第二个参数表示参照位置
        ExcelStream.Seek(0, SeekOrigin.Begin);
        //然后返回到页面MIME文件类型(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型
     return File(自定义内存流名, "application/vnd.ms-excel", 自定义文件名);
    }

到这里导出本页就写完了,下面演示一遍

在这里插入图片描述

如图所示,我查询出的数据一共有6条,现在我让他每页显示5条,点击导出本页得到如下

在这里插入图片描述

这样就只导出了本页显示的五条数据。



版权声明:本文为weixin_44540198原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。