java 导出word 包含echarts图表

java 导出word 包含echarts图表

需求是导出word,里面有数据统计图表。

要从后端直接导出图表的话,思路是这样的:

  先通过echarts生成图片,通过phantomjs 截图,将图片暂存在本地,再将图片转换成base64,然后放入word。

 

phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器。

 

一、准备word模板,转换成xml,需要填入数据的地方用${字段},需要天出图片的地方可以先随便一张用图片替代,方便之后找到图片插入位置。这里就不多说了

 

二、准备环境、依赖

 1、准备js,需要用到的,放在同一个文件夹下面。自己更改echarts-convert.js的路径

  

 

 

   echarts.min.js 和jquery.js 去官网下载

  echarts-convert.js的内容如下:

  

(function () {
    var system = require("system");
    var fs = require("fs");
    var config = {
        // define the location of js files
        //这样写要求这三个js在同一个文件夹下
        JQUERY: "jquery-3.5.1.min.js",
        //ESL: "esl.js",
        ECHARTS: "echarts.min.js",
        // default container width and height
        DEFAULT_WIDTH: "400",
        DEFAULT_HEIGHT: "600"
    }, parseParams, render, pick, usage;

    usage = function () {
        console.log("
Usage: phantomjs echarts-convert.js -options options -outfile filename -width width -height height"
            + "OR"
            + "Usage: phantomjs echarts-convert.js -infile URL -outfile filename -width width -height height
");
    };

    pick = function () {
        var args = arguments, i, arg, length = args.length;
        for (i = 0; i < length; i += 1) {
            arg = args[i];
            if (arg !== undefined && arg !== null && arg !== "null" && arg != "0") {
                return arg;
            }
        }
    };

    parseParams = function () {
        var map = {}, i, key;
        if (system.args.length < 2) {
            usage();
            phantom.exit();
        }
        for (i = 0; i < system.args.length; i += 1) {
            if (system.args[i].charAt(0) === "-") {
                key = system.args[i].substr(1, i.length);
                if (key === "infile") {
                    // get string from file
                    // force translate the key from infile to options.
                    key = "options";
                    try {
                        map[key] = fs.read(system.args[i + 1]).replace(/^s+/, "");
                    } catch (e) {
                        console.log("Error: cannot find file, " + system.args[i + 1]);
                        phantom.exit();
                    }
                } else {
                    map[key] = system.args[i + 1].replace(/^s+/, "");
                }
            }
        }
        return map;
    };

    render = function (params) {
        var page = require("webpage").create(), createChart;

        var bodyMale = config.SVG_MALE;
        page.onConsoleMessage = function (msg) {
            console.log(msg);
        };

        page.onAlert = function (msg) {
            console.log(msg);
        };

        createChart = function (inputOption, width, height,config) {
            var counter = 0;
            function decrementImgCounter() {
                counter -= 1;
                if (counter < 1) {
                    console.log(messages.imagesLoaded);
                }
            }

            function loadScript(varStr, codeStr) {
                var script = $("<script>").attr("type", "text/javascript");
                script.html("var " + varStr + " = " + codeStr);
                document.getElementsByTagName("head")[0].appendChild(script[0]);
                if (window[varStr] !== undefined) {
                    console.log("Echarts." + varStr + " has been parsed");
                }
            }

            function loadImages() {
                var images = $("image"), i, img;
                if (images.length > 0) {
                    counter = images.length;
                    for (i = 0; i < images.length; i += 1) {
                        img = new Image();
                        img.onload = img.onerror = decrementImgCounter;
                        img.src = images[i].getAttribute("href");
                    }
                } else {
                    console.log("The images have been loaded");
                }
            }
            // load opitons
            if (inputOption != "undefined") {
                // parse the options
                loadScript("options", inputOption);
                // disable the animation
                options.animation = false;
            }

            // we render the image, so we need set background to white.
            $(document.body).css("backgroundColor", "white");
            var container = $("<div>").appendTo(document.body);
            container.attr("id", "container");
            container.css({
                width: width,
                height: height
            });
            // render the chart
            var myChart = echarts.init(container[0]);
            myChart.setOption(options);
            // load images
            loadImages();
            return myChart.getDataURL();
        };

        // parse the params
        page.open("about:blank", function (status) {
            // inject the dependency js
            page.injectJs(config.ESL);
            page.injectJs(config.JQUERY);
            page.injectJs(config.ECHARTS);


            var width = pick(params.width, config.DEFAULT_WIDTH);
            var height = pick(params.height, config.DEFAULT_HEIGHT);

            // create the chart
            var base64 = page.evaluate(createChart, params.options, width, height,config);
            fs.write("base64.txt",base64);
            // define the clip-rectangle
            page.clipRect = {
                top: 0,
                left: 0,
                width: width,

                height: height
            };
            // render the image
            page.render(params.outfile);
            console.log("render complete:" + params.outfile);
            // exit
            phantom.exit();
        });
    };
// get the args
    var params = parseParams();

// validate the params
    if (params.options === undefined || params.options.length === 0) {
        console.log("ERROR: No options or infile found.");
        usage();
        phantom.exit();
    }
// set the default out file
    if (params.outfile === undefined) {
        var tmpDir = fs.workingDirectory + "/tmp";
        // exists tmpDir and is it writable?
        if (!fs.exists(tmpDir)) {
            try {
                fs.makeDirectory(tmpDir);
            } catch (e) {
                console.log("ERROR: Cannot make tmp directory");
            }
        }
        params.outfile = tmpDir + "/" + new Date().getTime() + ".png";
    }

// render the image
    render(params);
}());
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » java 导出word 包含echarts图表