• table表单打印添加页码和自动分页


    今天接到一个需求,就是打印页面需要自动分页,并且添加分页页码。

    查找了很多插件或者文档都没有好的处理方法,所以准备自己写一个函数来处理。

    页面样式:

     要求:第一个页面添加总体的大表单,第二个页面添加小表单。并且自动分页,添加页码。table列表中如果有note字段的话,需要另起一行添加备注,如果没有则隐藏,字数最多为200字。

    先说思路:

    1. 可以将页面分为2种类型,第一种为首页,第二种为子页面:主要判断不同页面中列表最多能展示多少条数据

    2.计算数据总共能分为多少数组:也就是分为多少页面

    计算的思路:每行的行高 = (存在note的话 ?(Math.ceil(note的字数 / 80) * 30 + 每行的固定高度) :每行的固定高度 );

    计算每个页面添加几行数据: 循环所有的列表数据,然后将上面的行高相加,跟页面的高度进行判断,然后取数组的数据添加到新的数组中。

    代码:

    /**
     * @export
     * @param {*} arr 数组长度
     * @param {*} tableHeight 第一页-列表的高度
     * @param {*} otherHeight 第二页-列表的高度
     * @param {*} 每行数据的高度为30
     * @param {*} 每行备注的高度为30
     */
    export default function calculation (arr,tableHeight,otherHeight){
        const data = [];
        let dataIndex = 0;
        let totalH = 0;
        let start = 0;
        let end = 0;
        arr.map((item,index) =>{
            totalH += item.note ? (noteHeight(item.note) + 30) : 30;
            // 如果只有一页的话,没有超过全部高度的话,则将所有arr赋值给data,如果超过高度,则需要多个数组
            if(dataIndex === 0){
                if(totalH < tableHeight){
                    data[0] = arr;
                }else{
                    data[dataIndex] = arr.slice(0, index);
                    // 重置高度
                    totalH = 0;
                    dataIndex++;
                    start = index;
                }
            }
         // 如果超过一页的话,并且是填充满了整个页面 if(dataIndex > 0 && totalH >= otherHeight){ totalH = 0; end = index; data[dataIndex] = arr.slice(start, end) start = end; dataIndex++; }      // 如果超过一页,没有填充满,说明是最后一页 if(dataIndex > 0 && totalH < otherHeight){ data[dataIndex] = arr.slice(start, arr.length) } }) return data; } // 计算note的高度 function noteHeight(note){ let noteH = Math.ceil((note.length / 80)) * 30; return Number(noteH); }

    调用函数:

    pageArr:打印的所有table数组
    1000:第一个页面的高度(展示列表的高度)
    1200:第二个页面的高度(展示列表的高度)
     const tableList = calculation(pageArr,1000,1200);
     console.log('tableList', tableList);

    得到数据格式:

    之后就可以得到每个页面展示的条数了。剩下的就是样式的调整。

  • 相关阅读:
    【Docker】04 部署MySQL
    【Docker】03 基础操作
    【Nexus】Linux上的Maven私服搭建
    【Mybatis-Plus】01 快速上手
    【Java】IDEA普通JavaEE项目实现SSM整合
    【Vue】03 Slot 插槽 & 自定义事件
    【Vue】02 Component 组件 & Axios
    【Vue】01 基础语法
    【Vue】Vue-Cli 安装
    【Project】JS的Map对象前后交互问题
  • 原文地址:https://www.cnblogs.com/liumcb/p/14443013.html
Copyright © 2020-2023  润新知