vue3-print-nb 表格打印分页,第一页有空白的情况出现解决方法(两种:一种原生,一种基于element表格)

第一种:基于element表格分页

javascript 复制代码
<template>
    <!-- element分组打印 -->
  <div class="hello">
    <button v-print="printContent">打印</button>
    <div id="printDiv">
    <p>工资统计表</p>
    <p>
        <span>单据日期:2024-08-04 00:00:00</span>
        <span>年份:2024</span>
        <span>月份:8月份</span>
        <span>项目: 山东远大新能源科技有限公司</span>
    </p>
    <div v-for="(item, index) in tableData" :key="`${index}`">
        <el-table :data="item.tableData" stripe style="width: 100%">
            <el-table-column prop="code" label="序号" width="180" />
            <el-table-column prop="name" label="姓名" width="180" />
            <el-table-column prop="key1" label="日工考勤" />
            <el-table-column prop="key2" label="日工工资" />
            <el-table-column prop="key3" label="承包考勤" />
            <el-table-column prop="key4" label="承包工资" />
            <el-table-column prop="key5" label="回程路费" />
            <el-table-column prop="key6" label="应扣项" />
            <el-table-column prop="key7" label="借款" />
            <el-table-column prop="key8" label="质保金" />
            <el-table-column prop="key9" label="应得工资" />
            <el-table-column prop="key10" label="工人签字" />
        </el-table>
        <div class="fy" v-if="index!==tableData.length-1"></div>
    </div>
   

</div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data(){
    return{
        tableData:[],
        printContent:{
            id: 'printDiv',
            // preview: true, // 预览工具是否启用
            // previewTitle: '', // 预览页面的标题
            popTitle: '', // 打印页面的页眉
            }
    }
  },
  created(){
    for(let s=0;s<4;s++){
        const datas = {
            tableData:[]
        }
        for(let a=0;a<20;a++){
            const data = {
                code:(s * 20)+a + 1,
                name:"name" + (s * 20)+a + 1,
                key1:(s * 20)+a + 1,
                key2:(s * 20)+a + 1,
                key3:(s * 20)+a + 1,
                key4:(s * 20)+a + 1,
                key5:(s * 20)+a + 1,
                key6:(s * 20)+a + 1,
                key7:(s * 20)+a + 1,
                key8:(s * 20)+a + 1,
                key9:(s * 20)+a + 1,
                key10:(s * 20)+a + 1
            }
            datas.tableData.push(data)
        }
        
        this.tableData.push(datas)
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}

.fy{
    page-break-before: always;
}
</style>

第二种基于原生表格分页

javascript 复制代码
<template>
    <!-- 原生表格打印 -->
  <div class="hello">
    <button v-print="printContent" @click="printing">打印</button>
    <div id="printDiv">
    <p style="text-align: center;">工资统计表</p>
    <p>
        <span>单据日期:2024-08-04 00:00:00</span>
        <span>年份:2024</span>
        <span>月份:8月份</span>
        <span>项目: 山东远大新能源科技有限公司</span>
    </p>
    <table border="0" class="techniques" cellpadding="0" cellspacing="0" style="margin-top: 1px;width: 100%;border:solid 1px #f1f1f1">
        <thead>
            <tr>
                <td>序号</td>
                <td>姓名</td>
                <td>日工考勤</td>
                <td>日工工资</td>
                <td>承包考勤</td>
                <td>承包工资</td>
                <td>回程路费</td>
                <td>应扣项</td>
                <td>借款</td>
                <td>质保金</td>
                <td>应得工资</td>
                <td>工人签字</td>
            </tr>
        </thead>
        <tbody class="paging">
            <tr v-for="(item, index) in tableData" :key="`akl-${index}`">
                <td>{{item['code']}}</td>
                <td>{{item['name']}}</td>
                <td>{{item['key1']}}</td>
                <td>{{item['key2']}}</td>
                <td>{{item['key3']}}</td>
                <td>{{item['key4']}}</td>
                <td>{{item['key5']}}</td>
                <td>{{item['key6']}}</td>
                <td>{{item['key7']}}</td>
                <td>{{item['key8']}}</td>
                <td>{{item['key9']}}</td>
                <td>{{item['key10']}}</td>
            </tr>
        </tbody>
    </table>
</div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data(){
    return{
        tableData:[],
        printContent:{
            id: 'printDiv',
            // preview: true, // 预览工具是否启用
            // previewTitle: '', // 预览页面的标题
            popTitle: '', // 打印页面的页眉
            },
            PAGE_HEIGHT:1100
    }
  },
  created(){
    for(let s=0;s<100;s++){
        const data = {
            code:s+1,
            name:"name" + s+1,
            key1:s+1,
            key2:s+1,
            key3:s+1,
            key4:s+1,
            key5:s+1,
            key6:s+1,
            key7:s+1,
            key8:s+1,
            key9:s+1,
            key10:s+1
        }
        this.tableData.push(data)
    }
  },
  methods:{
    printing(){
    const splitDoms = document.getElementsByClassName('paging')
    let startY = 0 // 占用A4纸的高度,从每页第一个poetry div的top值开始累加
    for (let i = 0; i < splitDoms.length; i++) {
        const splitDom = splitDoms[i]
        const splitValue = splitDom.getBoundingClientRect()
        if (startY === 0) {
            startY = splitValue.top
        }
        const pageHeight = splitValue.bottom - startY
        // 当加上当前div的高度大于A4纸高度时,给前一个div加上分页标识
        if (pageHeight > this.PAGE_HEIGHT) {
            console.log(i)
            startY = 0
            if (i > 0) {
                splitDoms[i - 1].style.pageBreakBefore = 'always'; // 给前一个元素添加分页符
            }
        }
    }
}
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
/* 添加CSS样式以确保换页 */
@page {
    size: auto A4 landscape;
    margin-top: 20mm;
}

@media print {
    .section {
        page-break-before: always;
        /* 在每个部分之前始终开始新页面 */
        margin-top: 0;
    }
}
td{
    border:solid 1px #f1f1f1;
}
</style>
相关推荐
喵叔哟15 分钟前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js
man20171 小时前
【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
vue.js·spring boot·后端
阿征学IT1 小时前
vue过滤器初步使用
前端·javascript·vue.js
王哲晓1 小时前
第四十五章 Vue之Vuex模块化创建(module)
前端·javascript·vue.js
丶21361 小时前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web
发现你走远了1 小时前
『VUE』25. 组件事件与v-model(详细图文注释)
前端·javascript·vue.js