vue打印数据,可分页打印

使用的是vue-easy-print 打印插件
可以支持分页打印。
转载https://download.csdn.net/download/qq_36845014/10807027?utm_source=bbsseo

在开发是 想要打印功能 但是打印数据不想显示出来 在打印的时候要打印初数据

第一步引入vue-easy-print
npm install vue-easy-print
第二部在页面以引入组件方式引入文件

 <el-button type="primary" style="float:right" size="mini" @click="sortingListPrint">打印交接单</el-button>
 // sortingListPrint调用接口获取打印数据
 <div>
      <vue-easy-print tableShow ref="easyPrint" >
          <div id="printTable">
            <demo :tableData="dialogData"  @clickPrint="clickPrint"></demo>
          </div>
      </vue-easy-print>
   </div>
   
import vueEasyPrint from "vue-easy-print";
import demo from "./demo";

components:{
    vueEasyPrint,
    demo
  },
clickPrint(){
     let vm = this
     vm.$nextTick(function(){
       vm.$refs.easyPrint.print();
     })
   },

dialogData是表格打印的数据,clickPrint是我组件间通信方法

因为需要不显示数据就要实现打印所以使用css来控制

<style>
  #printTable{display:none}
  @media print {
      #printTable{
          display:block;
      }
  }
</style>

顺序不可颠倒 @media print媒体查询 打印的时候显示数据
因为页面渲染问题 需要渲染完毕才能执行print打印 所以使用watch加nextTick方式实现
demo组件中
监控列表展示数据 渲染完毕执行下一步

watch:{
    tableData: function(){
      this.$nextTick(function(){
        console.log(this.tableData)
        this.$emit('clickPrint')
      })
    }
  },

再次特别感谢 qq_36845014 所有实现方式都是在此基础上的再次开发
demo.vue

<template>
    <div>
        <div v-for="page in pages" :key="page">
            <!-- 分页 -->
            <div class='tab_company_out'>
                <h2>外送清单</h2>
                <table cellpadding='0' cellspacing='0'>
                    <tr>
                        <th width='10%'>条码</th>
                        <th width='10%'>送检单位</th>
                        <th width='10%'>外送单位</th>
                        <th width='20%'>项目</th>
                        <th width='6%'>姓名</th>
                        <th width='6%'>性别</th>
                        <th width='6%'>年龄</th>
                        <th width='12%'>预计出报告时间</th>
                        <th width='6%'>分拣人</th>
                        <th width='12%'>分拣时间</th>
                    </tr>
                    <!-- 每页显示onePageRow条数据 -->
                    <tr v-for="(row,index) in tableData.slice((page-1)*onePageRow,page*onePageRow)" :key="index">
                        <!-- <td>{
  {(page-1)*onePageRow + index + 1}}</td> -->
                        <td>{
  {row.barcode}}</td>
                        <td>{
  {row.sampleSourceName}}</td>
                        <td>{
  {row.unitName}}</td>
                        <td>{
  {row.sfStr}}</td>
                        <td>{
  {row.name}}</td>
                        <td>{
  {row.sex}}</td>
                        <td>{
  {row.age}}</td>
                        <td>{
  {row.maxReportDate}}</td>
                        <td>{
  {row.sortName}}</td>
                        <td>{
  {row.sortTime}}</td>
                    </tr>
                    <!-- 插入空白行 -->
                    <template v-if="blankLines===true && tableData.slice((page-1)*onePageRow,page*onePageRow).length<onePageRow">
                        <tr v-for="d in (onePageRow-tableData.slice((page-1)*onePageRow,page*onePageRow).length)" :key="`_${d}_`">
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                        </tr>
                    </template>
                </table>
                <ul class='lu'>
                    <li>签字:
                        
                    </li>
                    <li>日期:
                        
                    </li>
                </ul>
            </div>
        </div>
    </div>
</template>


<script>
export default {
  name: "demo",
  // 制作打印模版组件时,props区域尽量保留。
  props: {
    // 接受的打印数据
    tableData: {},

    // 每页多少行
    onePageRow: {
      type: Number,
      default: 15
    },
    // 是否插入空白行
    blankLines: {
      type: Boolean,
      default: true
    },

    getChineseNumber: Function // 求数字的中文写法,从easyPrint组件传入
  },
  data() {
    return {};
  },
  watch:{
    tableData: function(){
      this.$nextTick(function(){
        this.$emit('clickPrint')
      })
    }
  },
  computed: {
    pages() {
      // 求当前数据能打印的页数
      var pages_ = Math.ceil(this.tableData.length / this.onePageRow); // 向上取整数
      return pages_ <= 0 ? 1 : pages_;
      // return 1;
    },
    chineseTotal() {
      // 计算中文合计,如果忘记传入
      return this.getChineseNumber != null
        ? this.getChineseNumber(this.tableData.total_amount)
        : "您还没有传入getChineseNumber";
    }
  },

  methods: {
    test() {
    }
  }
};
</script>

<style scoped>
* {
  padding: 0;
  margin: 0;
  list-style-type: none;
  font-family: "微软雅黑";
  font-size: 12px;
}

.tab_company_out {
  text-align: center;
  width: 100%;
  margin: auto;
  page-break-after: always;
  margin-bottom: 20px
}

h2 {
  padding: 20px;
  font-size: 18px
}

.dan {
  text-align: center;
  position: relative;
}

.dan span {
  position: absolute;
  right: 0;
}

p {
  overflow: hidden;
  padding: 10px 0;
}

p span {
  float: left;
}

p span ins {
  text-decoration: underline;
}

p time {
  float: right;
}

table {
  width: 100%;
  border: none;
  border-bottom: 1px solid #000;
}

table tr td {
  border: 1px solid #000;
  border-bottom: none;
  border-right: none;
  height: 20px;
  line-height: 20px;
  text-align: center
}

table tr td:last-of-type,
table tr th:last-of-type {
  border-right: 1px solid #000;
}

table tr th {
  border-top: 1px solid #000;
  border-left: 1px solid #000;
  height: 22px;
  line-height: 22px;
  font-size: 12px;
  text-align: center
}

table tr th:nth-child(2) {
  width: 0;
}

.lu {
  display: inline-block;
  padding-top: 10px;
  display: flex;
  justify-content: space-around;
}

.lu li {
  float: left;
  text-align: left;
  margin-right: 15px;
}

.lu li label {
  width: 100px;
  display: inline-block;
}

.lu li:last-of-type {
  margin-right: 0;
}
</style>
    原文作者:一条小鲨鱼
    原文地址: https://blog.csdn.net/qq_34239734/article/details/94721970
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞