inbody怎么打印vue2打印el-table等数据

新闻资讯2026-04-20 23:50:51
  1. 首先创建一个js文件,我这里就随便起了一个名字叫print.js

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

  1. 依赖安装完成后

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

/* eslint-disable */

const Print = function (dom, options) , 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 = ,

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') + "{}</style>";

//支持多页打印

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

return str;

},

getHtml: function () else {

inputs[k].removeAttribute('checked')

}

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

}

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

}

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

child[i].removeAttribute('selected')

}

}

}

}

}

// 包裹要打印的元素

// fix:

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

return outerHTML;

},

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

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

wrapperRefDom: function (refDom) else {

prevDom = currDom.cloneNode(true)

}

currDom = currDom.parentElement

}

return prevDom

},

writeIframe: function (content) , 100)

}

},

toPrint: function (frameWindow)

} 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());

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. 到这里打印功能就实现喽