前端打印el-table等数据

  1. 首先创建一个js文件,我这里就随便起了一个名字叫print.js

  1. 然后下载依赖 npm i file-saver npm i xlsx

  1. 依赖安装完成后

// 打印类属性、方法定义

/* eslint-disable */

const Print = function (dom, options) {

if (!(this instanceof Print)) return new Print(dom, options);

this.options = this.extend({

'noPrint': '.no-print'

}, options);

if ((typeof dom) === "string") {

this.dom = document.querySelector(dom);

} else {

this.isDOM(dom)

this.dom = this.isDOM(dom) ? dom : dom.$el;

}

this.init();

};

Print.prototype = {

init: function () {

var content = this.getStyle() + this.getHtml();

this.writeIframe(content);

},

extend: function (obj, obj2) {

for (var k in obj2) {

obj[k] = obj2[k];

}

return obj;

},

getStyle: function () {

var str = "",

styles = document.querySelectorAll('style,link');

for (var i = 0; i < styles.length; i++) {

str += styles[i].outerHTML;

}

str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";

//支持多页打印

str += "<style>html,body,div{height: auto!important;font-size:8px; margin:0}</style>";

return str;

},

getHtml: function () {

var inputs = document.querySelectorAll('input');

var textareas = document.querySelectorAll('textarea');

var selects = document.querySelectorAll('select');

for (var k = 0; k < inputs.length; k++) {

if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {

if (inputs[k].checked == true) {

inputs[k].setAttribute('checked', "checked")

} else {

inputs[k].removeAttribute('checked')

}

} else if (inputs[k].type == "text") {

inputs[k].setAttribute('value', inputs[k].value)

} else {

inputs[k].setAttribute('value', inputs[k].value)

}

}

for (var k2 = 0; k2 < textareas.length; k2++) {

if (textareas[k2].type == 'textarea') {

textareas[k2].innerHTML = textareas[k2].value

}

}

for (var k3 = 0; k3 < selects.length; k3++) {

if (selects[k3].type == 'select-one') {

var child = selects[k3].children;

for (var i in child) {

if (child[i].tagName == 'OPTION') {

if (child[i].selected == true) {

child[i].setAttribute('selected', "selected")

} else {

child[i].removeAttribute('selected')

}

}

}

}

}

// 包裹要打印的元素

// fix: https://github.com/xyl66/vuePlugs_printjs/issues/36

let outerHTML = this.wrapperRefDom(this.dom).outerHTML

return outerHTML;

},

// 向父级元素循环,包裹当前需要打印的元素

// 防止根级别开头的 css 选择器不生效

wrapperRefDom: function (refDom) {

let prevDom = null

let currDom = refDom

// 判断当前元素是否在 body 中,不在文档中则直接返回该节点

if (!this.isInBody(currDom)) return currDom

while (currDom) {

if (prevDom) {

let element = currDom.cloneNode(false)

element.appendChild(prevDom)

prevDom = element

} else {

prevDom = currDom.cloneNode(true)

}

currDom = currDom.parentElement

}

return prevDom

},

writeIframe: function (content) {

var w, doc, iframe = document.createElement('iframe'),

f = document.body.appendChild(iframe);

iframe.id = "myIframe";

//iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";

iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');

w = f.contentWindow || f.contentDocument;

doc = f.contentDocument || f.contentWindow.document;

doc.open();

doc.write(content);

doc.close();

var _this = this

iframe.onload = function(){

_this.toPrint(w);

setTimeout(function () {

document.body.removeChild(iframe)

}, 100)

}

},

toPrint: function (frameWindow) {

try {

setTimeout(function () {

frameWindow.focus();

try {

if (!frameWindow.document.execCommand('print', false, null)) {

frameWindow.print();

}

} catch (e) {

frameWindow.print();

}

frameWindow.close();

}, 10);

} catch (err) {

console.log('err', err);

}

},

// 检查一个元素是否是 body 元素的后代元素且非 body 元素本身

isInBody: function (node) {

return (node === document.body) ? false : document.body.contains(node);

},

isDOM: (typeof HTMLElement === 'object') ?

function (obj) {

return obj instanceof HTMLElement;

} :

function (obj) {

return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';

}

};

const MyPlugin = {}

MyPlugin.install = function (Vue, options) {

// 4. 添加实例方法

Vue.prototype.$print = Print

}

export default MyPlugin

把以上代码粘到刚才创建的js文件中

  1. vue 需要在main.js中 把APP包裹一下

import Print from './utils/print'

Vue.use(Print);

  1. 在需要打印的组件中 引入

import html2canvas from 'html2canvas';

然后封装一个函数

printArea(){

// this.isPrint = true;

// setTimeout(() => {

// this.$print(this.$refs['print-content']) //打印

// this.isPrint = false;

// });

const printContent = this.$refs.printId;

// 获取dom 宽度 高度

const width = printContent.clientWidth;

const height = printContent.clientHeight;

// 创建一个canvas节点

const canvas = document.createElement('canvas');

const scale = 4; // 定义任意放大倍数,支持小数;越大,图片清晰度越高,生成图片越慢。

canvas.width = width * scale; // 定义canvas 宽度 * 缩放

canvas.height = height * scale; // 定义canvas高度 *缩放

canvas.style.width = width * scale + 'px';

canvas.style.height = height * scale + 'px';

canvas.getContext('2d').scale(scale, scale); // 获取context,设置scale

const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; // 获取滚动轴滚动的长度

const scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; // 获取水平滚动轴的长度

html2canvas(printContent, {

canvas,

backgroundColor: null,

useCORS: true,

windowHeight: document.body.scrollHeight,

scrollX: -scrollLeft, // 解决水平偏移问题,防止打印的内容不全

scrollY: -scrollTop

}).then((canvas) => {

const url = canvas.toDataURL('image/png')

printJS({

printable: url,

type: 'image',

documentTitle: '', // 标题

style: '@page{size:auto;margin: 0cm 1cm 0cm 1cm;}' // 去除页眉页脚

})

}).catch(err=>{

console.error(err);

})

},

  1. 给需要被打印的元素 加 ref=“printId” id=“printId”

我这里给的是 el-table外层的div

<div class="result" v-loading="loading" ref="printId" id="printId">

  1. <el-button type="primary" @click="printArea" icon="el-icon-printer">打印</el-button>

  1. 到这里打印功能就实现喽

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过以下步骤实现勾选导出: 1. 在el-table组件中添加checkbox列,并绑定v-model到一个数组中,用于保存用户勾选的数据。 2. 添加导出按钮,当用户点击导出按钮时,将勾选的数据提交到后端进行导出。 3. 在后端实现导出功能,根据接收到的勾选数据,将相应的数据导出为Excel或CSV格式文件,供用户下载。 以下是一个简单的实现示例: ```html <template> <div> <el-table :data="tableData" style="width: 100%"> <el-table-column type="selection" width="55"> </el-table-column> <el-table-column prop="name" label="姓名"> </el-table-column> <el-table-column prop="age" label="年龄"> </el-table-column> </el-table> <el-button @click="handleExport">导出</el-button> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18 }, { name: '李四', age: 20 }, { name: '王五', age: 22 }, ], selectedData: [], // 用于保存用户勾选的数据 }; }, methods: { handleExport() { // 将勾选的数据提交给后端进行导出 console.log('selectedData:', this.selectedData); // TODO: 提交数据给后端进行导出 }, }, }; </script> ``` 在上面的示例中,我们在el-table组件中添加了一个checkbox列,并绑定v-model到selectedData数组中,用于保存用户勾选的数据。当用户点击导出按钮时,我们调用handleExport方法将勾选的数据提交给后端进行导出。在实际开发中,您需要根据具体业务需求进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值