echarts java吗_java后端生成echarts图片

一、所需工具

1、phantomjs

2、EChartsConvert

二、Maven依赖

org.freemarker

freemarker

2.3.28

org.apache.httpcomponents

httpclient

4.5.7

com.alibaba

fastjson

1.2.56

三、运行EchartsConvert

1、安装phantomjs、EchartsConvert

解压 phantomjs-2.1.1-windows.zip 和 saintlee-echartsconvert-master.zip

2、命令行输入指令

命令行输入 -s -p

笔者没有配置环境变量,完整输入为

C:\Users\Administrator\Desktop\phantomjs-2.1.1-windows\bin>phantomjs C:\Users\Administrator\Desktop\echartsconvert\echarts-convert.js -s -p 6666

显示echarts-convert server start success. [pid]=10364表明启动成功

四、java代码

1、结构

dfc28fd7d786

image.png

2、工具类

Http工具类

package com.mosband.genecharts.util;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import org.apache.http.HttpEntity;

import org.apache.http.NameValuePair;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

public class HttpUtil {

public static String post(String url, Map params, String charset)

throws ClientProtocolException, IOException {

String responseEntity = "";

// 创建CloseableHttpClient对象

CloseableHttpClient client = HttpClients.createDefault();

// 创建post方式请求对象

HttpPost httpPost = new HttpPost(url);

// 生成请求参数

List nameValuePairs = new ArrayList<>();

if (params != null) {

for (Entry entry : params.entrySet()) {

nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

}

}

// 将参数添加到post请求中

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, charset));

// 发送请求,获取结果(同步阻塞)

CloseableHttpResponse response = client.execute(httpPost);

// 获取响应实体

HttpEntity entity = response.getEntity();

if (entity != null) {

// 按指定编码转换结果实体为String类型

responseEntity = EntityUtils.toString(entity, charset);

}

// 释放资源

EntityUtils.consume(entity);

response.close();

return responseEntity;

}

}

Freemarker工具类

package com.mosband.genecharts.util;

import java.io.File;

import java.io.IOException;

import java.io.StringWriter;

import java.util.Map;

import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;

public class FreemarkerUtil {

private static final String path = FreemarkerUtil.class.getClassLoader().getResource("").getPath();

public static String generateString(String templateFileName, String templateDirectory, Map datas)

throws IOException, TemplateException {

Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);

// 设置默认编码

configuration.setDefaultEncoding("UTF-8");

// 设置模板所在文件夹

configuration.setDirectoryForTemplateLoading(new File(path + templateDirectory));

// 生成模板对象

Template template = configuration.getTemplate(templateFileName);

// 将datas写入模板并返回

try (StringWriter stringWriter = new StringWriter()) {

template.process(datas, stringWriter);

stringWriter.flush();

return stringWriter.getBuffer().toString();

}

}

}

生成Echarts工具类

package com.mosband.genecharts.util;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import org.apache.http.client.ClientProtocolException;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

public class EchartsUtil {

private static String url = "http://localhost:6666";

private static final String SUCCESS_CODE = "1";

public static String generateEchartsBase64(String option) throws ClientProtocolException, IOException {

String base64 = "";

if (option == null) {

return base64;

}

option = option.replaceAll("\\s+", "").replaceAll("\"", "'");

// 将option字符串作为参数发送给echartsConvert服务器

Map params = new HashMap<>();

params.put("opt", option);

String response = HttpUtil.post(url, params, "utf-8");

// 解析echartsConvert响应

JSONObject responseJson = JSON.parseObject(response);

String code = responseJson.getString("code");

// 如果echartsConvert正常返回

if (SUCCESS_CODE.equals(code)) {

base64 = responseJson.getString("data");

}

// 未正常返回

else {

String string = responseJson.getString("msg");

throw new RuntimeException(string);

}

return base64;

}

}

option.ftl

{

title: {

text:'${title}',

x:'middle',

textAlign:'center'

},

xAxis: {

type: 'category',

data: ${categories}

},

yAxis: {

type: 'value'

},

series: [{

data: ${values},

type: 'bar'

}]

}

测试类

package com.mosband.genecharts;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.HashMap;

import org.apache.http.client.ClientProtocolException;

import com.alibaba.fastjson.JSON;

import com.mosband.genecharts.util.EchartsUtil;

import com.mosband.genecharts.util.FreemarkerUtil;

import freemarker.template.TemplateException;

import sun.misc.BASE64Decoder;

public class App {

public static void main(String[] args) throws ClientProtocolException, IOException, TemplateException {

// 变量

String title = "水果";

String[] categories = new String[] { "苹果", "香蕉", "西瓜" };

int[] values = new int[] { 3, 2, 1 };

// 模板参数

HashMap datas = new HashMap<>();

datas.put("categories", JSON.toJSONString(categories));

datas.put("values", JSON.toJSONString(values));

datas.put("title", title);

// 生成option字符串

String option = FreemarkerUtil.generateString("option.ftl", "/com/mosband/genecharts/template", datas);

// 根据option参数

String base64 = EchartsUtil.generateEchartsBase64(option);

System.out.println("BASE64:" + base64);

generateImage(base64, "C:/Users/Administrator/Desktop/test.png");

}

public static void generateImage(String base64, String path) throws IOException {

BASE64Decoder decoder = new BASE64Decoder();

try (OutputStream out = new FileOutputStream(path)){

// 解密

byte[] b = decoder.decodeBuffer(base64);

for (int i = 0; i < b.length; ++i) {

if (b[i] < 0) {

b[i] += 256;

}

}

out.write(b);

out.flush();

}

}

}

五、效果

控制台打印结果

BASE64:iVBORw0KGgoAAAANSUhEUgAAA...

test.png

dfc28fd7d786

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值