上一篇可以很方便地实现图表图片的生成,并且支持多图表合并,但是还有两个缺陷,那就是文字居中和换行,因为所有元素都是使用绝对位置绘制出来的。这一篇通过生成Html,并转成Image的方式,可以解决这个问题。
1.生成单个图表的html字符串
private static String getSingleImageHtml(String title,List<String> headTitle,List<List<String>> contentArray){
//String html = "<!DOCTYPE html><html><body style=\"width:570px;\">";
String html = "<table border=\"1\" style=\"border-collapse:collapse;width:570px;border:1px solid black;background: white;\" cellpadding=\"0\" cellspacing=\"0\">";
html+="<thead>";
html+="<tr ><th colspan=\"4\" style=\"text-align: center;width: 570px;height:40px;font-size: 22px;\">"+title+"</th></tr>";
html+="<tr>";
for(int i = 0;i<4;i++){
String thEle = "";
thEle = "<th style=\"height:30px;width:"+(i == 2?"52%":"16%")+";text-align: center;margin:0;color: #ffffff;background:#0070c0;border:1px solid black;font-size: 20px;\">"+headTitle.get(i)+"</th>";
html+=thEle;
}
html+="</tr>";
html+="</thead>";
html+="<tbody>";
for(List<String> contents:contentArray){
html+="<tr>";
for(int j = 0;j<4;j++){
String tdEle = "";
tdEle = "<td style=\"height:30px;width:"+(j == 2?"52%":"16%")+";text-align: center;margin:0;border:1px solid black;font-size: 18px;\">"+contents.get(j)+"</td>";
html+=tdEle;
}
html+="</tr>";
}
html+="</tbody>";
html+="</table>";
//html+="</body></html>";
return html;
}
2.拼接多个table,并生成图片,此处使用到第三方库html2image(下载地址:http://mvnrepository.com/search?q=html2image)
public static String graphicsHtmlGeneration(List<List<List<String>>> allValue,List<String> titles,List<String[]> headers ,String receiver) throws Exception {
int i = 0;
String html = "";
for(List<List<String>> list:allValue){
String title = titles.get(i);
List<String> headTitle = Arrays.asList(headers.get(i));
html += getSingleImageHtml(title,headTitle,list);
i++;
}
if(html != null && html.length()>0){
HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
imageGenerator.loadHtml(html);
try {
// Thread.sleep(5000);
imageGenerator.getBufferedImage();
//Thread.sleep(8000);
String path = "1.png";
imageGenerator.saveAsImage(path);
return path;
} catch (Exception e) {
}
}
return null;
}
3.传递图表数据
public void initChartData(){
List