导出Excel报表+分页中的多重分页

3 篇文章 0 订阅

完成样图
完成样图
前段代码实现

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="layui-form">
    <div class="layui-form-item" style="position: relative; left: 50px;top: 30px;height: 80px">
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input type="text" class="layui-input" id="account" placeholder="场景名称">
            </div>
        </div>

        <div class="layui-inline">
            <div class="layui-input-inline">
                <button class="btn btn-success" οnclick="reLoad()">查询</button>
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-inline">
                <button class="btn btn-success" οnclick="exports()">导出近七天的报表</button>
            </div>
        </div>
    </div>
</div>
<table id="exampleTable" data-mobile-responsive="true">
</table>
<div th:include="include :: footer"></div>
<script>
    //存放 场景id
    var array = new Array();

    var prefix = "/bubble/report"
    $(function () {
        load();
    });
    function load() {
        $('#exampleTable').bootstrapTable(
            {
                method: 'get', // 服务器数据的请求方式 get or post
                url: prefix + "/tochartList", // 服务器数据的加载地址
                //	showRefresh : true,
                //	showToggle : true,
                //	showColumns : true,
                iconSize: 'outline',
                toolbar: '#exampleToolbar',
                striped: true, // 设置为true会有隔行变色效果
                dataType: "json", // 服务器返回的数据类型
                pagination: true, // 设置为true会在底部显示分页条
                // queryParamsType : "limit",
                // //设置为limit则会发送符合RESTFull格式的参数
                singleSelect: false, // 设置为true将禁止多选
                // contentType : "application/x-www-form-urlencoded",
                // //发送到服务器的数据编码类型
                pageSize: 10, // 如果设置了分页,每页数据条数
                pageNumber: 1, // 如果设置了分布,首页页码
                //search : true, // 是否显示搜索框
                showColumns: false, // 是否显示内容下拉框(选择显示的列)
                sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
                queryParams: function (params) {
                    return {
                        //说明:传入后台的参数包括offset开始索引,limit步长,sort排序列,order:desc或者,以及所有列的键值对
                        limit: params.limit,
                        offset: params.offset,
                        names: $.trim($('#account').val()),
                    };
                },
                // //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
                // queryParamsType = 'limit' ,返回参数必须包含
                // limit, offset, search, sort, order 否则, 需要包含:
                // pageSize, pageNumber, searchText, sortName,
                // sortOrder.
                // 返回false将会终止请求
                columns: [
                    {
                        field: 'id',
                        // title: '冒泡场景数据统计',
                        formatter: function (value, row, index) {
                            array.push(row.busi_id);
                            setTimeout(Loading, 800);
                            return '<table id="' + row.busi_id + '" data-mobile-responsive="true"></table>';
                        }
                    }
                ]
            }, setTimeout(Loading, 800));
    };
    /**
     *导出excel
     */
    function exports(nums) {
        layer.confirm('确定导出冒泡数据的信息?', {
            btn: ['确定', '取消']
        }, function (index) {
            //按钮【按钮一】的回调
            location.href = prefix + '/exports/' + nums;
            layer.close(index);
        }, function (index) {
            //按钮【按钮二】的回调
        });
        // layer.confirm("确认导出数据吗?", {
        //     btn: ['确定', '取消']
        //     // 按钮
        // }, function () {
        //
        //
        // }, function () {
        //
        // })
    }
    /**
     * 加载图形的方法
     * @constructor
     */
    function Loading() {
        for (var i = 0; i < array.length; i++) {
            buttonLoading(i)
            Loading2(i);
        }
        array = null;
        array = new Array();
        // 使用刚指定的配置项和数据显示图表。
        // myChart.setOption(option);
        // myChart2.setOption(option);
    }
    function buttonLoading(i) {
        var numa = parseInt(array[i]);
        var button = '<button class="btn btn-success" style="position: relative;left: 1050px;" οnclick="exports(' + numa + ')">导出场景报表</button>';
        $('#' + array[i]).before(button);
    }

    /**
     * 根据表格的id查询
     * @param myChart
     * @param i array的下标
     * @constructor
     */
    function Loading2(i) {
        //生成按钮


        $('#' + array[i]).bootstrapTable(
            {
                method: 'get', // 服务器数据的请求方式 get or post
                url: prefix + "/getBid/" + array[i], // 服务器数据的加载地址
                //	showRefresh : true,
                //	showToggle : true,
                //	showColumns : true,
                iconSize: 'outline',
                toolbar: '#' + array[i],
                striped: true, // 设置为true会有隔行变色效果
                dataType: "json", // 服务器返回的数据类型
                pagination: true, // 设置为true会在底部显示分页条
                // queryParamsType : "limit",
                // //设置为limit则会发送符合RESTFull格式的参数
                singleSelect: false, // 设置为true将禁止多选
                // contentType : "application/x-www-form-urlencoded",
                // //发送到服务器的数据编码类型
                pageSize: 10, // 如果设置了分页,每页数据条数
                pageNumber: 1, // 如果设置了分布,首页页码
                //search : true, // 是否显示搜索框
                showColumns: false, // 是否显示内容下拉框(选择显示的列)
                sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
                queryParams: function (params) {
                    return {
                        //说明:传入后台的参数包括offset开始索引,limit步长,sort排序列,order:desc或者,以及所有列的键值对
                        limit: params.limit,
                        offset: params.offset,
                        names: $.trim($('#account').val()),
                    };
                },
                // //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
                // queryParamsType = 'limit' ,返回参数必须包含
                // limit, offset, search, sort, order 否则, 需要包含:
                // pageSize, pageNumber, searchText, sortName,
                // sortOrder.
                // 返回false将会终止请求
                columns: [
                    {
                        field: 'busi_name',
                        title: '场景名',
                        width: 180
                    }, {
                        field: 'busi_id',
                        title: '场景id',
                        width: 180
                    }, {
                        field: 'priority',
                        title: '优先级'
                        , width: 180
                    }, {
                        field: 'target_user_number',
                        title: '目标用户数',
                        align: 'center'
                        , width: 180
                    }, {
                        field: 'push_reach_number',
                        title: '用户到达冒泡数据'
                        , width: 180
                    }, {
                        field: 'click_return_number',
                        title: '点击返回键的用户数'
                        , width: 180
                    }, {
                        field: 'click_fix_number',
                        title: '点击确定键的用户数'
                        , width: 180
                    }

                ]
            });
    }


    $("body").keydown(function () {
        if (event.keyCode == "13") {//keyCode=13是回车键
            $('#reLoad').click();
        }
        ;
    });

    function reLoad() {
        $.ajax({
            type: 'GET',
            data: {
                "limit": 10,
                "offset": 0,
                "names": $.trim($('#account').val()),
            },
            url: prefix + '/tochartList',
            success: function (data) {
                $('#exampleTable').bootstrapTable("load", data);
                setTimeout(Loading, 800);
            }
        })
    }
</script>
</body>
</html>

控制层代码


@Controller
@RequestMapping("/bubble/report")
public class BubbleReportController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    BubbleReportService bubbleReportService;
    /**
     * 冒泡数据详细报表
     *
     * @return
     */
    @GetMapping("/tochart4")
    @RequiresPermissions("market:activityStatistics:chart4")
    public String Tochart4() {
        return "market/activityStatistics/chart4";
    }

    /**
     * 查出所有的数据
     * @return
     */
    @GetMapping("/tochartList")
    @ResponseBody
    public PageUtils tochartList(@RequestParam Map<String, Object> params){
        Object offset = params.get("offset");
        //显示数量
        Object limit = params.get("limit");
        //场景名称
        Object senceName=params.get("names");

        //查询数据sql
        StringBuffer sql=new StringBuffer("select * from  bubble_report   where true ");
        //查询总数sql2
        StringBuffer sql2=new StringBuffer("SELECT count(*) as count FROM `bubble_report` where true");
        if (senceName != null && senceName.toString().length() > 1) {
            sql.append(" and busi_name like '%" + senceName + "%' or  busi_id = '"+senceName+"'");
            sql2.append(" and busi_name like '%" + senceName + "%' or  busi_id = '"+senceName+"'");
        }
        sql.append("GROUP BY  busi_id  limit " + offset + "," + limit);
        //查询列表数据
        List<Map<String, Object>> blackListList = jdbcTemplate.queryForList(sql.toString());

        int total = Convert.toInt(jdbcTemplate.queryForMap(sql2.toString()).get("count").toString());
        PageUtils pageUtils = new PageUtils(blackListList, total);
        return pageUtils;
    }

    /**
     * 根据场景id获取报表数据
     *
     * @return
     */
    @ResponseBody
    @RequestMapping("/getBid/{id}")
    public PageUtils getBid(@PathVariable("id") Integer id, @RequestParam Map<String, Object> params) {
        //起始数
        Object offset = params.get("offset");
        //显示数量
        Object limit = params.get("limit");
        //场景名称
        Object senceName=params.get("names");
        //查询数据sql
        StringBuffer sql =  new StringBuffer("select * from bubble_report where busi_id="+id);
        //查询总数sql
        StringBuffer sql2 = new StringBuffer("select count(1) as count from bubble_report where busi_id="+id);

        if (senceName != null && senceName.toString().length() > 1) {
            sql.append(" and busi_name like '%" + senceName + "%' or  busi_id = '"+senceName+"'");
            sql2.append(" and busi_name like '%" + senceName + "%' or  busi_id = '"+senceName+"'");
        }
        sql.append(" limit " + offset + "," + limit);
        //查询列表数据
        List<Map<String, Object>> blackListList = jdbcTemplate.queryForList(sql.toString());

        int total = Convert.toInt(jdbcTemplate.queryForMap(sql2.toString()).get("count"));
        PageUtils pageUtils = new PageUtils(blackListList, total);
        return  pageUtils;
    }
    @RequestMapping("/exports/{id}")
    @ResponseBody
    public void exports(@PathVariable("id") String id,HttpServletRequest request, HttpServletResponse response) {
        Map<String,Object> map=new HashMap<>();
        if (StringUtils.isNotBlank(id)&&!id.equals("undefined")) {
            map.put("busiid",id);
        }
        List<BubbleReportDO> list = bubbleReportService.list(map);
        try {
            ServletOutputStream out = response.getOutputStream();
            ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
            String fileName = new String("冒泡数据详细报表"
                    .getBytes("utf-8"), "iso8859-1");
            Sheet sheet1 = new Sheet(1, 0, BubbleReportDO.class);
            sheet1.setSheetName("sheet1");
            //表格样式
            short i=9;
            TableStyle tableStyle=new TableStyle();
            //设置样式
            Font font=new Font();
            font.setBold(true);
            font.setFontHeightInPoints(i);
            tableStyle.setTableHeadFont(font);
            tableStyle.setTableHeadBackGroundColor(IndexedColors.WHITE);
            tableStyle.setTableContentBackGroundColor(IndexedColors.WHITE);
            tableStyle.setTableContentFont(font);
            //设置表格样式
            sheet1.setTableStyle(tableStyle);
            sheet1.setAutoWidth(Boolean.TRUE);
            response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            writer.write(list, sheet1);
            writer.finish();
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

模型代码


public class BubbleReportDO extends BaseRowModel implements Serializable {

    private static final long serialVersionUID = 15353L;

    public Integer getBusiid() {
        return busiid;
    }

    public void setBusiid(Integer busiid) {
        this.busiid = busiid;
    }

    public String getBusiname() {
        return businame;
    }

    public void setBusiname(String businame) {
        this.businame = businame;
    }

    public Integer getPriority() {
        return priority;
    }

    public void setPriority(Integer priority) {
        this.priority = priority;
    }

    public Integer getTargetusernumber() {
        return targetusernumber;
    }

    public void setTargetusernumber(Integer targetusernumber) {
        this.targetusernumber = targetusernumber;
    }

    public Integer getPushreachnumber() {
        return pushreachnumber;
    }

    public void setPushreachnumber(Integer pushreachnumber) {
        this.pushreachnumber = pushreachnumber;
    }

    public Integer getClickreturnnumber() {
        return clickreturnnumber;
    }

    public void setClickreturnnumber(Integer clickreturnnumber) {
        this.clickreturnnumber = clickreturnnumber;
    }

    public Integer getClickfixnumber() {
        return clickfixnumber;
    }

    public void setClickfixnumber(Integer clickfixnumber) {
        this.clickfixnumber = clickfixnumber;
    }

    private Integer id;

    @ExcelProperty(value = "场景id", index = 0)
    private Integer busiid;

    @ExcelProperty(value = "场景名称", index = 1)
    private String businame;

    @ExcelProperty(value = "优先级", index = 2)
    private Integer priority;
    @ExcelProperty(value = "目标用户数", index = 3)
    private Integer targetusernumber;
    public static long getSerialVersionUID() {
        return serialVersionUID;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    @ExcelProperty(value = "用户到达冒泡数据", index = 4)
    private Integer pushreachnumber;

    @ExcelProperty(value = "点击返回键的用户数", index = 5)
    private Integer clickreturnnumber;

    @ExcelProperty(value = "点击确定键的用户数", index = 6)
    private Integer clickfixnumber;
}

需要导入的包

	<!--easyExcel-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>1.1.2-beat1</version>
		</dependency>
		<!-- POI -->
		<dependency>
		      <groupId>org.apache.poi</groupId>
		      <artifactId>poi</artifactId>
		      <version>3.15</version>
		</dependency>
		<dependency>
		      <groupId>org.apache.poi</groupId>
		      <artifactId>poi-ooxml</artifactId>
		      <version>3.15</version>
		</dependency>

注意: POI的版本不能过低,否则报错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现分页功能,在导出Excel表格之前,你需要先将数据按照每页显示的数据条数进行分割,然后将每一页的数据分别写入不同的工作簿。 以下是一个简单的Vue导出Excel表格分页的实现方法: 1. 安装依赖包 使用 `npm` 或 `yarn` 安装以下依赖包: ``` npm install file-saver xlsx ``` 2. 创建一个导出Excel表格的方法 在Vue的组件创建一个方法,用于导出Excel表格。这个方法接收两个参数:`data` 和 `title`。其,`data` 是要导出的数据,`title` 是导出Excel表格的标题。 ``` exportExcel(data, title) { const fileName = `${title}.xlsx`; const sheetSize = 10; // 每页显示的数据条数 const sheetCount = Math.ceil(data.length / sheetSize); // 工作簿数量 const workbook = { Sheets: {}, SheetNames: [] }; for (let i = 0; i < sheetCount; i++) { const sheetData = data.slice(i * sheetSize, (i + 1) * sheetSize); const sheetName = `Sheet${i + 1}`; const worksheet = XLSX.utils.json_to_sheet(sheetData); workbook.Sheets[sheetName] = worksheet; workbook.SheetNames.push(sheetName); } const excelBuffer = XLSX.write(workbook, { bookType: "xlsx", type: "array" }); const excelBlob = new Blob([excelBuffer], { type: "application/octet-stream" }); saveAs(excelBlob, fileName); } ``` 3. 调用导出Excel表格的方法 在需要导出Excel表格的地方,调用上面创建的方法即可。例如: ``` exportExcel(this.tableData, "表格数据"); ``` 这样就可以将 `tableData` 的数据按照每页显示10条的方式分页,并导出为多个工作簿的Excel表格,每个工作簿显示10条数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值