1、所需工具
1》phantomjs:官網下載http://phantomjs.org/download.html 國內鏡像http://npm.taobao.org/dist/phantomjs/
2》EChartConvert:https://gitee.com/saintlee/echartsconvert
2、Maven依賴
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
3、使用phantomjs裝載運行EChartConvert
1》phantomjs、EChartConvert解壓即可使用
解壓 phantomjs-2.1.1-windows.zip 和 saintlee-echartsconvert-master.zip。配置phantomjs環境變量。
命令行輸入:<phantomjs路徑> <EChartsConvert路徑> -s -p <服務端口號>
Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\fyliu\software\phantomjs-2.1.1-windows\echartsconvert-gitee>phantomjs echarts -convert.js -s -p 6666 echarts-convert server start success. [pid]=2284
4、項目目錄結構

1》HttpUtil.java
package com.lfy.cn.PhantomJSEChartsTest.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<String, String> params, String charset)
throws ClientProtocolException, IOException {
String responseEntity = "";
// 創建CloseableHttpClient對象
CloseableHttpClient client = HttpClients.createDefault();
// 創建post方式請求對象
HttpPost httpPost = new HttpPost(url);
// 生成請求參數
List<NameValuePair> nameValuePairs = new ArrayList<>();
if (params != null) {
for (Entry<String, String> 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;
}
}
2》FreemarkerUtil.java
package com.lfy.cn.PhantomJSEChartsTest.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<String, Object> 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();
}
}
}
3》EchartsUtil.java
package com.lfy.cn.PhantomJSEChartsTest.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<String, String> 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'
}]
}
App.java
package com.lfy.cn.PhantomJSEChartsTest;
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.lfy.cn.PhantomJSEChartsTest.util.EchartsUtil;
import com.lfy.cn.PhantomJSEChartsTest.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<String, Object> 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/lfy/cn/PhantomJSEChartsTest/template", datas);
// 根據option參數
String base64 = EchartsUtil.generateEchartsBase64(option);
System.out.println("BASE64:" + base64);
generateImage(base64, "C:/Users/lfy/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();
}
}
}
記錄下 很好用
x軸的
axisLabel: {
interval:0
}
可解決 x軸顯示不全問題
運行結果:生成一張ECharts圖片
