一导出world
import $ from "jquery"; // import saveAs from "../../../assets/js/FileSaver" ,报错这个依耐必须npm包才正确,如下; import saveAs from 'file-saver' //这个也不用引入,因为htmldocx2引入了这个依耐包
// jquery和saveAs是下面两种插件【wordexport,htmldocx2】的共同依耐包,所以必须引入,不同的是htmldocx2可以对cavas进行解析 import wordexport from "../../../assets/js/jquery.wordexport"; //htmldocx是htmldocx2的依耐包。htmldocx2是自己根据第三方包改造的,因为本身第三方插件不支持echart导出图形 改造后里面会引入第三方包htmldocx
而且html-docx-js本身是在node环境下引入的 但是可以把打包代码引入过来放到本地的文件去引入这个依耐
//import htmldocx from 'html-docx-js' import htmldocx2 from "../../../assets/js/htmldocx";//这个文件是自己在原来插件的基础上进行改写已达到能导出echart图形的目的,借鉴的别人写的
// 注,如果在外面使用 注意jquery 要初始化 不然不会响应 // $("#btn-word").click(function(event) { // $('.content').wordExport('生成文档') // }); // 第一种html2docx插件的使用修改源码 $(function(){ $('#btn-word').on('click',function(){$('.content').html2docx('文档')}) }) //第二种 wordexport插件的使用 jQuery(document).ready(function($) { console.log(12) $("#btn-word").click(function(event) { $('.content').wordExport('生成文档') }); }); Jq方法 markup.find('div.chart[_echarts_instance_]').has('canvas,svg').each(function () { Clone(true):包括克隆元素的方法的存储数据 还有一种方法 未测试,网址如下 : https://www.jianshu.com/p/529550d32b6d?tdsourcetag=s_pcqq_aiomsg
/* * HTML内容生成docx文档(基于:https://github.com/evidenceprime/html-docx-js) * 本插件只用于作者参与的项目,未经许可请勿转载 */ /* global htmlDocx, saveAs, html2canvas */ import echarts from 'echarts' import saveAs from './FileSaver' // const htmlDocx=require ('./html-docx.js') // 解决不能引入问题 挂载在全局widow对象上 import htmlDocx from './html-docx.js' (function ($) { // 'use strict' $.fn.html2docx = function (filename,option) { console.log(window,saveAs,filename,option) var option =option if ($(this).length) { filename = filename || '未命名' var ImageMaxWidth = 620 var imgscount = 0 var markup = null var $this = $(this).first() if (typeof layer !== 'undefined') { layer.msg('正在生成,请稍候...', { icon: 16, time: 0, shade: [0.1, '#000'] }) } else if (typeof AMUI === 'object') { $('#btn-word').prop('disabled', true).find('i').attr('class', 'am-icon-circle-o-notch am-icon-spin') } else { $('#btn-word').prop('disabled', true).data('value', $('#btn-word').val()).val('请稍候...') } // 装载基础脚本 var deferreds = [] // if (typeof saveAs === 'undefined') { deferreds.push($.ajax('//lib.baomitu.com/FileSaver.js/1.3.3/FileSaver.min.js', { dataType: 'script', cache: true })) } // if (typeof htmlDocx === 'undefined') { deferreds.push($.ajax('//cdn.psy.com.cn/scripts/html-docx.js', { dataType: 'script', cache: true })) } if ($this.find('svg').length && typeof html2canvas === 'undefined') { deferreds.push($.ajax('//cdn.psy.com.cn/scripts/html2canvas.min.js', { dataType: 'script', cache: true })) } $.when.apply(null, deferreds).done(makedocx0) // makedocx0() // console.log(deferreds,$.ajax('//cdn.psy.com.cn/scripts/html-docx.js.', { dataType: 'script', cache: true })) } return this // 处理svg元素,由于异步所以分离 function makedocx0 () { var svgs = $this.find('svg') if (svgs.length) { console.log(1111) var deferreds = [] svgs.each(function () { var svg = $(this) deferreds.push( html2canvas(this).then(function (canvas) { svg.after('<img src="' + canvas.toDataURL('image/png') + '">') svg.remove() }) ) }) $.when.apply(null, deferreds).done(makedocx1) } else { console.log(1111) makedocx1() } } // 生成docx:处理 function makedocx1 () { // 克隆 markup = $this.clone(true) console.log($this) // 移除某些节点 markup.find('iframe,embed,style').remove() markup.contents().each(function () { var $this = $(this) if (this.nodeType === 8 || $this.is('input[type="hidden"]') || $this.is('.word-hidden') || $this.is('.no-word')) { $this.remove() } }) // 处理图片 var imgs = markup.find('img') imgscount = imgs.length console.log(imgscount) if (imgscount === 0) { makedocx2() } else { var canvas = document.createElement('canvas') var ctx = canvas.getContext('2d') imgs.each(function () { var $img = $(this) var src = $img.attr('src') // 原来的对应图片 var img = $this.find('img[src="' + src + '"]').get(0) // 已经是base64编码的图片不再处理 if (src.indexOf('data:') === 0) { makedocx2() } else { var w = Math.min(img.width, ImageMaxWidth) // 只处理宽度大于0的 if (w === 0) { $img.remove() makedocx2() } else { var h = img.height * (w / img.width) var a = document.createElement('a') var dataURL = '' a.href = src // 同源 if (a.host === window.location.host) { ctx.clearRect(0, 0, canvas.width, canvas.height) canvas.width = w canvas.height = h ctx.drawImage(img, 0, 0, w, h) dataURL = canvas.toDataURL() $img.attr('src', dataURL).removeAttr('width') makedocx2() } // 外站 else { // 获取base64 var url = '' src = src.replace(/^(http:\/\/|https:\/\/|\/\/)/gi, '') if (a.host === 'images.weserv.nl') { url = src + '&encoding=base64' } else { url = '//images.weserv.nl/?url=' + src + '&w=' + w + '&encoding=base64' } $.get(url, function (dataURL) { $img.attr('src', dataURL).removeAttr('width') makedocx2() }) } a.remove() } } }) canvas.remove() } } // 生成docx:生成 function makedocx2 () { if (imgscount > 1) { imgscount-- } else { // 处理Echarts // 原来获取不到数据是因为markup是克隆的 克隆clone需要传值才会复制数据和事件处理 markup.find('div.chart').has('canvas,svg').each(function () { //div.chart var option1 = $(this).data('option') var id = $(this).attr('id') var $old = $this.find('#' + id) // var option = $old.data('option') var height =500 var theme = $old.data('theme') console.log( $(this),option1) // var height = $old.height() // 问题 控制台报错 如果不写无法渲染额chart,如果写只要执行到这段代码控制台报错,好像是option一直没有值,因为调用是没有传这个值的 // console.log( $(this),echarts,id,$old,option,theme,height) // var $new = $('<div style="width:' + ImageMaxWidth + 'px;height:' + height + 'px;"></div>') // var dom = $new.get(0) // $.extend(true, option1, { animation: false, toolbox: { show: false }, tooltip: { show: false, trigger: 'none' } }) // $(this).after($new) // var mychart = echarts.init(dom, theme) // mychart.setOption(option1) // var src = mychart.getDataURL({ backgroundColor: '#fff', excludeComponents: ['toolbox', 'tooltip'] }) // console.log(11111111111111111) // $new.replaceWith('<div style="text-align:center;"><img src="' + src + '"></div>') // mychart.dispose() // 克隆的Echarts与已有的冲突,所以新建DOM,重新绘制 if (option1) { console.log(111111111,option1,echarts) if (typeof (option1) === 'string') { option1 = JSON.parse(option1) } //改变位置解决报错误 var $new = $('<div style="width:' + ImageMaxWidth + 'px;height:' + height + 'px;"></div>') var dom = $new.get(0) $.extend(true, option1, { animation: false, toolbox: { show: false }, tooltip: { show: false, trigger: 'none' } }) $(this).after($new) var mychart = echarts.init(dom, theme) mychart.setOption(option1) var src = mychart.getDataURL({ backgroundColor: '#fff', excludeComponents: ['toolbox', 'tooltip'] }) console.log(11111111111111111) $new.replaceWith('<div style="text-align:center;"><img src="' + src + '"></div>') mychart.dispose() } $(this).remove() }) // 处理样式 markup.find('h1').css({ 'text-align': 'center' }) markup.find('p').css({ 'text-indent': '2em' }) markup.find('table').css({ 'border-collapse': 'collapse', 'width': '100%' }).removeAttr('class') markup.find('th').css({ 'border': '1px solid #000', 'text-align': 'center', 'background-color': '#e8e8e8' }) markup.find('td').css({ 'border': '1px solid #000', 'text-align': 'center' }) markup.find('.am-text-primary').css({ 'color': '#5085FF' }).removeClass('am-text-primary') markup.find('.text-left,.am-text-left').css({ 'text-align': 'left' }).removeClass('text-left am-text-left') markup.find('.text-center,.am-text-center').css({ 'text-align': 'center' }).removeClass('text-center am-text-center') markup.find('.text-right,.am-text-right').css({ 'text-align': 'right' }).removeClass('text-right am-text-right') markup.find('.text-top').css({ 'vertical-align': 'top' }).removeClass('text-top') markup.find('[class=""]').removeAttr('class') markup.find('[contenteditable]').removeAttr('contenteditable') // 再次移除某些节点 markup.find('script').remove() // console.log(markup.html()) var content = '<!DOCTYPE html><html><body>' + markup.html() + '</body></html>' var converted = window.htmlDocx.asBlob(content) markup.remove() if (typeof layer !== 'undefined') { layer.closeAll() } else if (typeof AMUI === 'object') { $('#btn-word').prop('disabled', false).find('i').attr('class', 'am-icon-file-word-o') } else { $('#btn-word').prop('disabled', false).val($('#btn-word').data('value')) } saveAs.saveAs(converted, filename + '.docx') } } } })(jQuery)
导出excel插件
Export2Excel
import Vue from 'vue'
import Axios from '../http'
import store from '../store/index'
// 获取组别列表
// 设置组别
export const global={
setGroup:function(){
Axios.get("/api/v1/admin/roleGroup").then(function (res) {
let data = res["data"]["data"]
localStorage.setItem("roleGroup",data)
}).catch(function (err) {
alert(err)
})
},
// 导出功能
handleDownload:function(tHeader,filterVal,arr) {
//参数分别是表头,表头对应的参数要和arr数据里属性一致,他们的长度要相同
require.ensure([], () => {
const { export_json_to_excel } = require("@/vendor/Export2Excel.js");
if (arr.length == 0) {
alert("请至少一条数据导入");
return;
}
const data = global.formatJson(filterVal, arr);
export_json_to_excel(tHeader, data, "导出的列表excel");
});
},
formatJson:function(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]));
},
// 封装函数树节点转化为扁平
NestedToFlat(group) {
var res = []
var that = this
for(var key in group ){
res.push({
id: group[key].id,
name: group[key].name,
pid: group[key].pid
})
if (group[key]['items'].length!==0) {
res = res.concat(global.NestedToFlat(group[key]['items']));
}
}
return res;
},
//扁平换为树节点
treeData(source, id, parentId, children){
let cloneData = JSON.parse(JSON.stringify(source))
return cloneData.filter(father=>{
let branchArr = cloneData.filter(child => father[id] == child[parentId]);
branchArr.length>0 ? father[children] = branchArr : ''
return father[parentId] == 0 // 如果第一层不是parentId=0,请自行修改
})
},
// 检查权限
actioncheck(name){
if (store.state.btnList.indexOf(name)>-1) {
return true
}else{
return false
}
},
assecsshave(name){
if (store.state.btnList.indexOf(name)>-1) {
}
}
// 计算日期
// dels:function(url,data){
// var that = this
// this.$confirm("此操作将永久删除该文件, 是否继续?", "提示", {
// confirmButtonText: "确定",
// cancelButtonText: "取消",
// type: "warning"
// })
// .then(() => {
// // 点击确定开始删除
// this.axios
// .post(url, data)
// .then(function(res) {
// console.log(res);
// if (res["data"]["code"] == 0) {
// that.$message("删除成功");
// // that.getlist(that.page.currentpage, that.page.pagesize);
// } else {
// that.$message(res["data"]["msg"]);
// }
// });
// })
// .catch(() => {
// this.$message({
// type: "info",
// message: "已取消删除"
// });
// });
// }
}