vue2通过jquery.wordexport.js实现word导出

jquery.wordexport.js依赖jquery;
首先npm i jquery file-saver --save;
引入jquery
首先在根目录下创建vue.config.js
vue.config.js

const webpack = require('webpack')
module.exports = {
    //lintOnSave: false,
    configureWebpack: {
        //支持jquery
        plugins: [
            new webpack.ProvidePlugin({
                $: "jquery",
                jQuery: "jquery",
                "windows.jQuery": "jquery"
            })
        ]
    },
};

创建FileSaver.js和jquery.wordexport.js两个文件,一般放到assets下面的js目录下;
FileSaver.js

/* FileSaver.js
 * A saveAs() FileSaver implementation.
 * 1.3.2
 * 2016-06-16 18:25:19
 *
 * By Eli Grey, http://eligrey.com
 * License: MIT
 *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
 */

/*global self */
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */

/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */

var saveAs = saveAs || (function(view) {
    "use strict";
    // IE <10 is explicitly unsupported
    if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
        return;
    }
    var
          doc = view.document
          // only get URL when necessary in case Blob.js hasn't overridden it yet
        , get_URL = function() {
            return view.URL || view.webkitURL || view;
        }
        , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
        , can_use_save_link = "download" in save_link
        , click = function(node) {
            var event = new MouseEvent("click");
            node.dispatchEvent(event);
        }
        , is_safari = /constructor/i.test(view.HTMLElement)
        , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
        , throw_outside = function(ex) {
            (view.setImmediate || view.setTimeout)(function() {
                throw ex;
            }, 0);
        }
        , force_saveable_type = "application/octet-stream"
        // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
        , arbitrary_revoke_timeout = 1000 * 40 // in ms
        , revoke = function(file) {
            var revoker = function() {
                if (typeof file === "string") { // file is an object URL
                    get_URL().revokeObjectURL(file);
                } else { // file is a File
                    file.remove();
                }
            };
            setTimeout(revoker, arbitrary_revoke_timeout);
        }
        , dispatch = function(filesaver, event_types, event) {
            event_types = [].concat(event_types);
            var i = event_types.length;
            while (i--) {
                var listener = filesaver["on" + event_types[i]];
                if (typeof listener === "function") {
                    try {
                        listener.call(filesaver, event || filesaver);
                    } catch (ex) {
                        throw_outside(ex);
                    }
                }
            }
        }
        , auto_bom = function(blob) {
            // prepend BOM for UTF-8 XML and text/* types (including HTML)
            // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
            if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
                return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
            }
            return blob;
        }
        , FileSaver = function(blob, name, no_auto_bom) {
            if (!no_auto_bom) {
                blob = auto_bom(blob);
            }
            // First try a.download, then web filesystem, then object URLs
            var
                  filesaver = this
                , type = blob.type
                , force = type === force_saveable_type
                , object_url
                , dispatch_all = function() {
                    dispatch(filesaver, "writestart progress write writeend".split(" "));
                }
                // on any filesys errors revert to saving with object URLs
                , fs_error = function() {
                    if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
                        // Safari doesn't allow downloading of blob urls
                        var reader = new FileReader();
                        reader.onloadend = function() {
                            var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
                            var popup = view.open(url, '_blank');
                            if(!popup) view.location.href = url;
                            url=undefined; // release reference before dispatching
                            filesaver.readyState = filesaver.DONE;
                            dispatch_all();
                        };
                        reader.readAsDataURL(blob);
                        filesaver.readyState = filesaver.INIT;
                        return;
                    }
                    // don't create more object URLs than needed
                    if (!object_url) {
                        object_url = get_URL().createObjectURL(blob);
                    }
                    if (force) {
                        view.location.href = object_url;
                    } else {
                        var opened = view.open(object_url, "_blank");
                        if (!opened) {
                            // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
                            view.location.href = object_url;
                        }
                    }
                    filesaver.readyState = filesaver.DONE;
                    dispatch_all();
                    revoke(object_url);
                }
            ;
            filesaver.readyState = filesaver.INIT;

            if (can_use_save_link) {
                object_url = get_URL().createObjectURL(blob);
                setTimeout(function() {
                    save_link.href = object_url;
                    save_link.download = name;
                    click(save_link);
                    dispatch_all();
                    revoke(object_url);
                    filesaver.readyState = filesaver.DONE;
                });
                return;
            }

            fs_error();
        }
        , FS_proto = FileSaver.prototype
        , saveAs = function(blob, name, no_auto_bom) {
            return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
        }
    ;
    // IE 10+ (native saveAs)
    if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
        return function(blob, name, no_auto_bom) {
            name = name || blob.name || "download";

            if (!no_auto_bom) {
                blob = auto_bom(blob);
            }
            return navigator.msSaveOrOpenBlob(blob, name);
        };
    }

    FS_proto.abort = function(){};
    FS_proto.readyState = FS_proto.INIT = 0;
    FS_proto.WRITING = 1;
    FS_proto.DONE = 2;

    FS_proto.error =
    FS_proto.onwritestart =
    FS_proto.onprogress =
    FS_proto.onwrite =
    FS_proto.onabort =
    FS_proto.onerror =
    FS_proto.onwriteend =
        null;

    return saveAs;
}(
       typeof self !== "undefined" && self
    || typeof window !== "undefined" && window
    || this.content
));
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the window

if (typeof module !== "undefined" && module.exports) {
  module.exports.saveAs = saveAs;
} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) {
  define([], function() {
    return saveAs;
  });
}

jquery.wordexport.js

var saveAs = require("./FileSaver.js").saveAs;

if (typeof jQuery !== "undefined" && typeof saveAs !== "undefined") {
    (function($) {
        $.fn.wordExport = function(fileName, baseArr) {
            fileName = typeof fileName !== 'undefined' ? fileName : "jQuery-Word-Export";
            var static = {
                mhtml: {
                    top: "Mime-Version: 1.0\nContent-Base: " + location.href + "\nContent-Type: Multipart/related; boundary=\"NEXT.ITEM-BOUNDARY\";type=\"text/html\"\n\n--NEXT.ITEM-BOUNDARY\nContent-Type: text/html; charset=\"utf-8\"\nContent-Location: " + location.href + "\n\n<!DOCTYPE html>\n<html>\n_html_</html>",
                    head: "<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<style>\n_styles_\n</style>\n</head>\n",
                    body: "<body>_body_</body>"
                }
            };
            var options = {
                maxWidth: 624
            };
            // Clone selected element before manipulating it
            var markup = $(this).clone();

            // Remove hidden elements from the output
            markup.each(function() {
                var self = $(this);
                if (self.is(':hidden'))
                    self.remove();
            });

            // Embed all images using Data URLs
            // var images = Array();
            // var img = markup.find('img');
            // for (var i = 0; i < img.length; i++) {
            //     // Calculate dimensions of output image
            //     var w = Math.min(img[i].width, options.maxWidth);
            //     var h = img[i].height * (w / img[i].width);
            //     // Create canvas for converting image to data URL
            //     var canvas = document.createElement("CANVAS");
            //     canvas.width = w;
            //     canvas.height = h;
            //     // Draw image to canvas
            //     var context = canvas.getContext('2d');
            //     context.drawImage(img[i], 0, 0, w, h);
            //     // Get data URL encoding of image
            //     var uri = canvas.toDataURL("image/png");
            //     console.log(uri,'uri')
            //     $(img[i]).attr("src", img[i].src);
            //     img[i].width = w;
            //     img[i].height = h;
            //     // Save encoded image to array
            //     images[i] = {
            //         type: uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")),
            //         encoding: uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")),
            //         location: $(img[i]).attr("src"),
            //         data: uri.substring(uri.indexOf(",") + 1)
            //     };
            // }

            // Prepare bottom of mhtml file with image data
            var mhtmlBottom = "\n";
            for (var i = 0; i < baseArr.length; i++) {
                mhtmlBottom += "--NEXT.ITEM-BOUNDARY\n";
                mhtmlBottom += "Content-Location: " + baseArr[i].location + "\n";
                mhtmlBottom += "Content-Type: " + baseArr[i].type + "\n";
                mhtmlBottom += "Content-Transfer-Encoding: " + baseArr[i].encoding + "\n\n";
                mhtmlBottom += baseArr[i].data + "\n\n";
            }
            mhtmlBottom += "--NEXT.ITEM-BOUNDARY--";

            //TODO: load css from included stylesheet
            var styles = "";

            // Aggregate parts of the file together
            var fileContent = static.mhtml.top.replace("_html_", static.mhtml.head.replace("_styles_", styles) + static.mhtml.body.replace("_body_", markup.html())) + mhtmlBottom;

            // Create a Blob with the file contents
            var blob = new Blob([fileContent], {
                type: "application/msword;charset=utf-8"
            });
            saveAs(blob, fileName + ".doc");
        };
    })(jQuery);
} else {
    if (typeof jQuery === "undefined") {
        console.error("jQuery Word Export: missing dependency (jQuery)");
    }
    if (typeof saveAs === "undefined") {
        console.error("jQuery Word Export: missing dependency (FileSaver.js)");
    }
}

单页面导出

//导出
        exportWord() {
            let _this = this;
            let baseArr = [];
            let pre = '';
            if(this.info.category!='A1'){
                var urlData = $('#bar1').find('canvas')[0].toDataURL("image/jpeg");
                baseArr.push({
                    data: urlData.substring(urlData.indexOf(":") + 1, urlData.indexOf(";")),
                    encoding: urlData.substring(urlData.indexOf(";") + 1, urlData.indexOf(",")),
                    location: urlData,
                    data: urlData.substring(urlData.indexOf(",") + 1)
                });
                for(let item of this.info.answer){
                    pre += `<div>
                            <h4>【${item.grade}】:<span>${item.score}</span></h4>
                            <h4>【测评程度】:<span>${item.banswer}</span></h4>
                            <p>${item.bdegree}</p>
                    </div>`
                }
            }else{
                pre = `<p>${this.info.result}</p>`
            }
            let html = `<div>
                <h2 style="text-align:center">《${this.$route.meta.title}》</h2>
                <div style="display:flex">
                    <span>姓名:${this.info.nickname}</span>&nbsp;&nbsp; <span>学号/序号:${this.info.id}</span><br />
                    <span>年龄:${this.info.age}</span>&nbsp;&nbsp; <span>班级/部门:${this.info.class_name}</span>&nbsp;&nbsp; <span>性别:${this.info.sex}</span><br>
                    <span>测评用时:${this.info.answer_time}</span>&nbsp;&nbsp; <span>生成时间:${this.info.add_time}</span><br>
                    <h4>测试结果</h4>
                    <img src="${urlData}">
                    ${pre}
                </div></div>`;
            setTimeout(function() {
                $(html).wordExport(_this.$route.meta.title+'-'+_this.info.nickname ,baseArr)
            }, 1000)
        }

批量导出

//导出
        exportWord(){
            if(this.checkedLists.length>0){
                for(let i = 0;i<this.checkedLists.length;i++){
                    setTimeout(()=>{
                        var info = this.checkedLists[i];
                        var answer = this.checkedLists[i].answer;
                        if(answer && answer.length){
                            this.title = answer.map(item=>{
                                return item.grade
                            });
                            this.score = answer.map(item=>{
                                return item.score
                            });
                        }
                        this.handEchart();
                        setTimeout(()=>{
                            // 等待echarts绘制完成之后再去导出 
                            this.echartsFinished(info,answer,this.base64)
                        },1000)
                    },i*1000)
                }
            }else{
                this.$message('请先选择需要导出的文件')
            }
        },
        echartsFinished(info,answer,base){
            let baseArr = [];
            let pre = '';
            if(answer){
                baseArr.push({
                    data: base.substring(base.indexOf(":") + 1, base.indexOf(";")),
                    encoding: base.substring(base.indexOf(";") + 1, base.indexOf(",")),
                    location: base,
                    data: base.substring(base.indexOf(",") + 1)
                })
                for(let item of answer){
                    pre += `<div>
                            <h4>【${item.grade}】:<span>${item.score}</span></h4>
                            <h4>【测评程度】:<span>${item.banswer}</span></h4>
                            <p>${item.bdegree}</p>
                    </div>`
                }
            }else{
                pre = `<p>${info.result.result}</p>`
            }
            let html = `<div>
                <h2 style="text-align:center">《${this.$route.meta.title}》</h2>
                <div style="display:flex">
                    <span>姓名:${info.nickname}</span>&nbsp;&nbsp; <span>学号/序号:${info.id}</span><br />
                    <span>班级/部门:${info.class_name}</span> &nbsp;&nbsp; <span>生成时间:${info.add_time}</span><br>
                    <h4>测试结果</h4>
                    <img src="${base}">
                    ${pre}
                </div></div>`;
            $(html).wordExport(this.$route.meta.title+'-'+info.nickname,baseArr);
        }

导出echarts图表方法

var opts = {
           type: 'jpeg', // 导出的格式,可选 png, jpeg
           pixelRatio: 1,// 导出的图片分辨率比例,默认为 1。
           backgroundColor: '#333',// 导出的图片背景色,默认使用 option 里的 backgroundColor
  }
  this.base64 = bar.getDataURL(opts);  //拿到base64 地址
  // bar.on('finished', () => {
      //    this.base64 = bar.getDataURL(opts)
  // })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容