效果图:
准备工作:
由于echarts是前端的包,后端需要用到依赖工具。
工具下载:
链接:https://pan.baidu.com/s/1NX9pf77SlEtU_QdKMn3_Ow
提取码:wli7
解压后我是直接放在D盘根目录下,echarts-convert.js:
PhantomJS工具(执行命令工具,需要配置环境变量)
官方文档:http://phantomjs.org/headless-testing.html
配置环境变量:
具体代码:
<!--导出echarts图片--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <dependency> <groupId>com.github.abel533</groupId> <artifactId>ECharts</artifactId> <version>2.2.6</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.9</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency>
复制
package com.chen.test; import com.chen.entity.MetricsMonitor; import com.chen.entity.PmsMetricsMonitorIndexVO; import com.github.abel533.echarts.Grid; import com.github.abel533.echarts.Label; import com.github.abel533.echarts.Legend; import com.github.abel533.echarts.Option; import com.github.abel533.echarts.Title; import com.github.abel533.echarts.axis.Axis; import com.github.abel533.echarts.axis.AxisLabel; import com.github.abel533.echarts.axis.CategoryAxis; import com.github.abel533.echarts.axis.ValueAxis; import com.github.abel533.echarts.code.AxisType; import com.github.abel533.echarts.code.LineType; import com.github.abel533.echarts.code.Orient; import com.github.abel533.echarts.code.Position; import com.github.abel533.echarts.code.SeriesType; import com.github.abel533.echarts.code.Trigger; import com.github.abel533.echarts.code.X; import com.github.abel533.echarts.series.Line; import com.google.gson.Gson; import lombok.SneakyThrows; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; /** * @Author: Chen * @Date: 2023/4/18 10:44 * @Desc: */ public class LeetCodeTest { private static final String JSpath = "D:\\echarts-convert\\echarts-convert1.js"; @SneakyThrows public static void main(String[] args) { MetricsMonitor metricsMonitor = new MetricsMonitor(); PmsMetricsMonitorIndexVO vo = new PmsMetricsMonitorIndexVO(); vo.setTechDeliDura(new BigDecimal(345)); metricsMonitor.setTargetValue(vo); List<PmsMetricsMonitorIndexVO> monitorIndexVOList = new ArrayList<>(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //造数据 for (int i = 1; i < 12; i++) { PmsMetricsMonitorIndexVO monitorIndexVO = new PmsMetricsMonitorIndexVO(); monitorIndexVO.setCurrentTimeStr(format.format(new Date())); if (i%2 == 0) { monitorIndexVO.setTechDeliDura(new BigDecimal((192.5 - i))); } else { monitorIndexVO.setTechDeliDura(new BigDecimal((92.9 + i))); } if (i==9) { monitorIndexVO.setTechDeliDura(new BigDecimal(55)); } if (i==10 || i==11) { monitorIndexVO.setTechDeliDura(new BigDecimal(367)); } monitorIndexVOList.add(monitorIndexVO); } metricsMonitor.setMetricsMonitorList(monitorIndexVOList); Option option = getTechDeliDuraOption(metricsMonitor); Map<String,Object> resultMap=new HashMap<>(); String path = generateEChart(new Gson().toJson(option), resultMap); // 构建HTTP POST请求,发送ECharts配置项和echarts.min.js文件 HttpPost httpPost = new HttpPost("https://www.echartsjs.com/api/echarts/export"); // 发送HTTP请求并获取响应 CloseableHttpClient httpClient = HttpClients.createDefault(); HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); // 将响应内容保存为PNG图像文件 OutputStream outputStream = new FileOutputStream("chart.png"); entity.writeTo(outputStream); outputStream.close(); } public static String generateEChart(String options, Map<String,Object> resultMap) { //获取时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HHmmss"); String nowDate = sdf.format(new Date()); String dataPath = writeFile(options); String fileName= String.format("%s库位移动量趋势图.png", nowDate); String path = "D:/temp/Echart/" + fileName; try { File file = new File(path); //文件路径(路径+文件名) if (!file.exists()) { //文件不存在则创建文件,先创建目录 File dir = new File(file.getParent()); dir.mkdirs(); file.createNewFile(); } String cmd = "phantomjs " + JSpath + " -infile " + dataPath + " -outfile " + path; Process process = Runtime.getRuntime().exec(cmd); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = ""; while ((line = input.readLine()) != null) { System.out.println("line++++++++++++++++++++"+line); } input.close(); } catch (IOException e) { e.printStackTrace(); }finally{ return path; } } public static String writeFile(String options) { String dataPath="D:\\chartData\\data" + UUID.randomUUID().toString().substring(0, 8) +".json"; try { File writename = new File(dataPath); // 相对路径,如果没有则要建立一个新的output.txt文件 if (!writename.exists()) { //文件不存在则创建文件,先创建目录 File dir = new File(writename.getParent()); dir.mkdirs(); writename.createNewFile(); // 创建新文件 } BufferedWriter out = new BufferedWriter(new FileWriter(writename)); out.write(options); // \r\n即为换行 out.flush(); // 把缓存区内容压入文件 out.close(); // 最后记得关闭文件 } catch (IOException e) { e.printStackTrace(); } return dataPath; } public static Option getTechDeliDuraOption(MetricsMonitor metricsMonitor) { List<PmsMetricsMonitorIndexVO> metricsMonitorList = metricsMonitor.getMetricsMonitorList(); Option optionTechDeliDura = new Option(); // 设置标题 Title title = new Title(); title.setText("平均技术交付时长趋势图(自然日)"); title.setTextAlign(X.left); optionTechDeliDura.setTitle(title); // 设置提示框 /*Tooltip tooltip = new Tooltip(); tooltip.setTrigger(Trigger.axis); optionTechDeliDura.setTooltip(tooltip);*/ optionTechDeliDura.tooltip().trigger(Trigger.axis); // 设置图例 Legend legend = new Legend(); List<Object> legendData = new ArrayList<>(); legendData.add("平均技术交付时长"); legendData.add("目标值"); legend.setData(legendData); legend.setOrient(Orient.vertical); optionTechDeliDura.setLegend(legend); // 设置网格 Grid grid = new Grid(); grid.setWidth(800); grid.setHeight(450); optionTechDeliDura.setGrid(grid); // 设置x轴 CategoryAxis xAxis = new CategoryAxis(); xAxis.setType(AxisType.category); xAxis.setBoundaryGap(false); List<Object> xAxisData = new ArrayList<>(); for (PmsMetricsMonitorIndexVO monitorIndexVO : metricsMonitorList) { xAxisData.add(monitorIndexVO.getCurrentTimeStr()); } xAxis.setData(xAxisData); AxisLabel axisLabel = new AxisLabel(); axisLabel.setRotate(45); xAxis.setAxisLabel(axisLabel); List<Axis> axisListX = new ArrayList<>(); axisListX.add(xAxis); optionTechDeliDura.setxAxis(axisListX); // 设置y轴 ValueAxis yAxis = new ValueAxis(); yAxis.setType(AxisType.value); List<Axis> axisListY = new ArrayList<>(); axisListY.add(yAxis); optionTechDeliDura.setyAxis(axisListY); Label lineLabel = new Label(); lineLabel.setShow(true); lineLabel.setPosition(Position.top); // 设置平均技术交付时长的线条 Line lineTechDeliDura = new Line(); List<Object> techDeliDuraData = new ArrayList<>(); for (PmsMetricsMonitorIndexVO monitorIndexVO : metricsMonitorList) { if (monitorIndexVO.getTechDeliDura() != null) { lineTechDeliDura.setType(SeriesType.line); lineTechDeliDura.setName("平均技术交付时长"); techDeliDuraData.add(monitorIndexVO.getTechDeliDura()); } else { techDeliDuraData.add("-"); } } lineTechDeliDura.setData(techDeliDuraData); lineTechDeliDura.itemStyle().normal().label(lineLabel); lineTechDeliDura.setShowAllSymbol(true); optionTechDeliDura.series(lineTechDeliDura); // 设置目标值的线条 Line targetLine = new Line(); List<Object> targetLineData = new ArrayList<>(); for (PmsMetricsMonitorIndexVO monitorIndexVO : metricsMonitorList) { targetLine.setType(SeriesType.line); targetLine.setName("目标值"); targetLineData.add(metricsMonitor.getTargetValue().getTechDeliDura()); } targetLine.setData(targetLineData); targetLine.itemStyle().normal().lineStyle().width(4).type(LineType.dotted); lineTechDeliDura.setShowAllSymbol(true); optionTechDeliDura.series(targetLine); return optionTechDeliDura; } }
复制
生成的文件:
chartData
temp