vue打印功能详解
安装Print包
npm install vue-print-nb --save
main.js全局注册
import Print from 'vue-print-nb'
Vue.use(Print);
使用
用v-print
指定需要打印的div
容器,本次叫printTest
。
最好使用行内样式,使用组件库部分样式可能不能生成。
<div id="printTest" >
<p>锄禾日当午</p>
<p>汗滴禾下土 </p>
<p>谁知盘中餐</p>
<p>粒粒皆辛苦</p>
</div>
<button v-print="'#printTest'">打印</button>
我的项目代码(ant design of vue组件)
<a-modal :title="`巡检单打印预览:${pollingListNO}`"
v-model="show"
:maskClosable="false"
width="80%"
:bodyStyle="bodyStyle"
@cancel="handleCancel">
<!-- <a-button key="back"
@click="handleCancel">取消</a-button>
<a-button key="submit"
type="primary"
style="margin-left: 16px"
:loading="submitLoading"
@click="handleConfirm">打印</a-button>
<a-divider /> -->
<template v-if="!loading">
<div id="printWrap"
title="测试">
<h6 style="font-size:24px;text-align: center;line-height:40px;">设备巡检单</h6>
<div style="height:80px;">
<div style="float:left;width:50%;"><span style="display:inline-block;width:100px">巡检单号:</span><span>{{ myInfo.pollingListNo||"无" }}</span></div>
<div style="float:left;width:50%;"><span style="display:inline-block;width:100px">派发时间:</span><span>{{ myInfo.distributionTime||"无" }}</span></div>
<div style="float:left;width:50%;"><span style="display:inline-block;width:100px">派发人:</span><span>{{ myInfo.distributionUserName||"无" }}</span></div>
<div style="float:left;width:50%;"><span style="display:inline-block;width:100px">完成期限:</span><span>{{ myInfo.pollingDeadline||"无" }}</span></div>
<div style="float:left;width:50%;"><span style="display:inline-block;width:100px">巡检人:</span><span>{{ myInfo.pollingUserName||"无" }}</span></div>
<div style="float:left;width:50%;"><span style="display:inline-block;width:100px">打印时间:</span><span>{{ printTime }}</span></div>
</div>
<!-- <a-table rowKey="id"
size="middle"
:bordered="true"
:columns="TableColumns"
:dataSource="myInfo.myCheckEquip"
:pagination="false"
:loading="loading">
<template slot="deailResponse"
slot-scope="deailResponse, record">
<span>{{ deailResponse.map((item,index)=>{return index+1+":"+item.pollingItemName}).join(";") }}</span>
</template>
<template slot="deailResponse"
slot-scope="deailResponse, record">
<span>{{ deailResponse.map((item,index)=>{return index+1+":"+item.pollingItemFunction}).join(";") }}</span>
</template>
</a-table> -->
<table style="width:100%;">
<thead>
<tr>
<th style="text-align:left;border:1px solid black;width:2%;">序号</th>
<th style="text-align:left;border:1px solid black;width:8%;">存放地点</th>
<th style="text-align:left;border:1px solid black;width:10%;">设备名称</th>
<th style="text-align:left;border:1px solid black;width:10%;">设备资产编号</th>
<th style="text-align:left;border:1px solid black;width:25%;">项目</th>
<th style="text-align:left;border:1px solid black;width:25%;">方法</th>
<th style="text-align:left;border:1px solid black;width:10%;">结果</th>
<th style="text-align:left;border:1px solid black;width:10%;">备注</th>
</tr>
</thead>
<tbody>
<template v-if="myInfo.myCheckEquip&&myInfo.myCheckEquip.length">
<tr v-for="(item,index) in myInfo.myCheckEquip"
:key="index">
<td style="text-align:left;border:1px solid black;width:4%;">{{ index+1 }}</td>
<td style="text-align:left;border:1px solid black;width:6%;">{{ item.location }}</td>
<td style="text-align:left;border:1px solid black;width:10%;">{{ item.equipmentName }}</td>
<td style="text-align:left;border:1px solid black;width:10%;">{{ item.equipmentAssetsNo }}</td>
<!-- <td style="text-align:left;border:1px solid black;width:25%;">{{ item.deailResponse&&item.deailResponse.length?item.deailResponse.map((deail,j)=>{return j+1+":"+deail.pollingItemName}).join(";"):"无" }}</td> -->
<td style="text-align:left;border:1px solid black;width:25%;">
<template v-if="item.deailResponse&&item.deailResponse.length">
<span style="display: block;"
v-for="(detail,j) in item.deailResponse">{{ j+1+"、"+detail.pollingItemName+";" }}</span>
</template>
<template v-else>无</template>
</td>
<!-- <td style="text-align:left;border:1px solid black;width:25%;">{{ item.deailResponse&&item.deailResponse.length?item.deailResponse.map((deail,j)=>{return j+1+":"+deail.pollingItemFunction}).join(";"):"无" }}</td> -->
<td style="text-align:left;border:1px solid black;width:25%;">
<template v-if="item.deailResponse&&item.deailResponse.length">
<span style="display: block;"
v-for="(detail,j) in item.deailResponse">{{ j+1+"、"+detail.pollingItemFunction+";" }}</span>
</template>
<template v-else>无</template>
</td>
<td style="text-align:left;border:1px solid black;width:10%;"></td>
<td style="text-align:left;border:1px solid black;width:10%;"></td>
</tr>
</template>
</tbody>
</table>
</div>
</template>
<template v-else>
<div class="spin-wrap">
<a-spin size="large" />
</div>
</template>
<template slot="footer">
<a-button key="back"
@click="handleCancel">取消</a-button>
<a-button key="submit"
type="primary"
v-print="'#printWrap'">打印</a-button>
</template>
</a-modal>
</template>
<script>
import moment from 'moment'
import { TableColumns } from './index'
import { printInfo } from '@/api/equipment/polling/myNowTask'
import { Empty } from 'ant-design-vue'
export default {
props: ['visible', 'pollingListSn', 'pollingListNO', 'userSn'],
data () {
return {
bodyStyle: {
'max-height': '600px',
'overflow': 'auto'
},
printTime: null,
loading: false,
TableColumns,
myInfo: {
myCheckEquip: []
}
}
},
computed: {
show: {
get: function () {
return this.visible
},
set: function () { }
}
},
watch: {
visible (newVal, oldVal) {
if (newVal) {
if (this.pollingListSn) {
this.getInfo()
this.printTime = moment().format('YYYY-MM-DD HH:mm:ss')
}
}
}
},
beforeCreate () {
this.simpleImage = Empty.PRESENTED_IMAGE_SIMPLE
},
methods: {
getInfo () {
this.loading = true
const { pollingListSn, userSn } = this
printInfo({ pollingListSn, userSn }).then(res => {
console.log('printInfo', res)
this.myInfo = res
}).finally(() => {
this.loading = false
})
},
handleCancel () {
this.$emit('close')
}
}
}
</script>
<style lang="less" scoped>
.spin-wrap {
text-align: center;
border-radius: 4px;
margin-bottom: 20px;
padding: 30px 50px;
margin: 20px 0;
}
</style>