页面统计了数据后,通过echarts能够很好的将数据已图表的像是展示出来,非常美观炫酷,但是仅仅在页面上展示是不够的,公司内部发送邮件报告需要以excel文档展示,所以,需要将以生成的echarts生成的图片传输到后台。 将图片传输到后台,通常我们需要将图片转成base64编码,后台对编码进行处理,就可以在服务器端生成图片,然后将图片放到Excel表中的制定位置。
echarts的getDataURL()方法
通过eharts处理数据展示在页面上的图表是canvas绘制,还不是图片元素,echarts的toolbox里面提供方法能够点击下载图片:
toolbox: {
show : true,
feature : {
dataView : {show: true, readOnly: false},
restore : {show: true},
saveAsImage : {show: true}
}
}
点击后可以下载png格式的图片,那么如何通过外部方式将canvas转成图片的base64编码呢?echarts中提供了getDataURL()方法。 要使用getDataURL()方法的前提是已有渲染的图片,以现有的一段代码为例(我的展示是以tab的形式展示,故会点击tab时重新渲染,虽然echarts会一直提示can’t find height and width):
var myChart3;//定义为全局变量,不然会找不到要转换的对象
function sumofper(dataY,data1,data2){
//获取数组中的最大值,以此来灵活控制y轴的高度
var max1=Math.max.apply(null,data1);
var max2=Math.max.apply(null,data2);
var arrr=[max1,max2];
var max=Math.max.apply(null,arrr);
var Max=max+5;//y轴高度比最大值大5
//重新渲染高和宽
var main=document.getElementById('mainss');
var resizemain=function (){
main.style.width=(window.innerWidth*0.9)+'px';
main.style.height=(window.innerHeigth*0.5)+'px';;
}
resizemain();
var barcampaign=echarts.init(document.getElementById('mainss'));
myChart3=barcampaign;//赋值给全局变量
$(window).on('resize',function(){//
//屏幕大小自适应,重置容器高宽
resizemain();
myChart3.resize();
});
option = {
title : {
text: '部门周人力饱和情况'
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['标准','实际']
},
toolbox: {
show : true,
feature : {
dataView : {show: true, readOnly: false},
restore : {show: true},
saveAsImage : {show: true}
}
},
calculable : true,
xAxis :
{
type : 'category',
data : dataY,
axisLabel:{
interval:0,
//rotate:45,
margin:2,
textStyle:{
color:"#000000"
}
}
},
grid: { // 控制图的大小,调整下面这些值就可以,
x: 170,
x2: 100,
y2: 50,// y2可以控制 X轴跟Zoom控件之间的间隔,避免以为倾斜后造成 label重叠到zoom上
},
yAxis :
{
type : 'value',
name:'次数',
max:Max,
},
series : [
{
name:'标准',
type:'bar',
barWidth : 30,
data:data1,
markLine : {
data : [
{type : 'average', name: '平均值'}
]
},
itemStyle:{
normal: {
label : {show: true, position:'top', textStyle: {
color: 'black'
}},
}
}
},
{
name:'实际',
type:'bar',
barWidth : 30,
data:data2,
markLine : {
data : [
{type : 'average', name : '平均值'}
]
},
itemStyle:{
normal: {
label : {show: true, position:'top', textStyle: {
color: 'black'
}},
}
}
}
]
};
myChart3.setOption(option);
}
然后是导出方法,转成base64编码
function exportall(){
//导出,导出当前数据和图形的base64编码
var picinfo1=myChart1.getDataURL();
var picinfo2=myChart2.getDataURL();
var picinfo3=myChart3.getDataURL();
$.ajax({
url:'exportWeekReport',//后台处理地址
dataType:'text',
type:'POST',
data:{"pic1":picinfo1,"pic2":picinfo2,"pic3":picinfo3},
error:function(errMsg){
alert(errMsg);
},
success:function(data){
alert("导出周报成功",{time:3000});
window.location.href = "report_downloadWeekreport";
}
});
}
后台处理方法
/**
* 解析图片
* @param base64Info
* @param filePath
* @return
*/
private String decodeBase64(String base64Info, File filePath){
if(StringUtils.isEmpty(base64Info)){
return null;
}
BASE64Decoder decoder = new BASE64Decoder();
String[] arr = base64Info.split("base64,");
// 数据中:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABI4AAAEsCAYAAAClh/jbAAA ... 在"base64,"之后的才是图片信息
String picPath = filePath+ "/"+ UUID.randomUUID().toString() +".png";
try {
byte[] buffer = decoder.decodeBuffer(arr[1]);
OutputStream os = new FileOutputStream(picPath);
os.write(buffer);
os.close();
} catch (IOException e) {
throw new RuntimeException();
}
return picPath;
}
然后处理导出到Excel中就可以了,至于处理导出和处理效果的代码我就不贴了,效果如下: