效果图:
源码不解释:
private void ResultToJpg(List<Map> list, String title, HttpServletResponse response) {
BufferedImage image;
int totalrow = list.size();
int totalcol = 7;
int imageWidth = 640;
int rowheight = 40;
int imageHeight = totalrow * rowheight + 105;
int startHeight = 20;
int startWidth = 10;
int colwidth = (int) ((imageWidth - 20) / totalcol);
int colwidth2 = (int) ((imageWidth - 20) / (totalcol + 1));
image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = (Graphics2D) image.getGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, imageWidth, imageHeight);
Font font = new Font("微软雅黑", Font.BOLD, 20);
graphics.setFont(font);
graphics.setColor(new Color(112, 48, 158));
graphics.drawString(Strings.sNull(title), startWidth, startHeight + 10);
font = new Font("微软雅黑", Font.PLAIN, 13);
graphics.setColor(new Color(99, 99, 99));
graphics.setFont(font);
String subtitle1 = "欢迎访问";
graphics.drawString(subtitle1, startWidth, startHeight + 30);
font = new Font("Arial, Helvetica, sans-serif", Font.BOLD, 13);
graphics.setColor(new Color(112, 48, 158));
graphics.setFont(font);
String subtitle2 = "inm.xuetang.cn";
graphics.drawString(subtitle2, startWidth + 60, startHeight + 30);
font = new Font("微软雅黑", Font.PLAIN, 13);
graphics.setColor(new Color(99, 99, 99));
graphics.setFont(font);
String subtitle3 = "冲榜、制榜!";
graphics.drawString(subtitle3, startWidth + 165, startHeight + 30);
//画首行
graphics.setColor(new Color(112, 48, 158));
graphics.fillRect(startWidth, startHeight + rowheight, imageWidth - 20, rowheight);
font = new Font("微软雅黑", Font.PLAIN, 12);
graphics.setColor(Color.WHITE);
graphics.setFont(font);
graphics.drawString("#", startWidth + 10, startHeight + rowheight * 2 - 15);
graphics.drawString("公众号", startWidth + colwidth - 10, startHeight + rowheight * 2 - 15);
//画表头
String[] headCells = {"发布", "总阅读数", " 头条", " 平均 ", "总点赞数", " WCI"};
for (int m = 0; m < headCells.length; m++) {
graphics.drawString(headCells[m].toString(), startWidth + colwidth2 * m + colwidth * 2, startHeight + rowheight * 2 - 15);
}
//画行
for (int j = 0; j < totalrow; j++) {
if (j % 2 == 0) {
graphics.setColor(new Color(255, 255, 255));
} else {
graphics.setColor(new Color(238, 238, 238));
}
graphics.fillRect(startWidth, startHeight + (j + 1) * rowheight + 40, imageWidth - 20, startHeight + (j + 1) * rowheight);
font = new Font("微软雅黑", Font.BOLD, 12);
graphics.setColor(new Color(112, 48, 158));
graphics.setFont(font);
graphics.drawString(String.valueOf(j + 1), startWidth + 10, startHeight + (j + 3) * rowheight - 15);
Map map = list.get(j);
font = new Font("微软雅黑", Font.PLAIN, 12);
graphics.setColor(new Color(0, 0, 0));
graphics.setFont(font);
graphics.drawString(Strings.sNull(map.get("wx_nickname")), startWidth + (colwidth / 2) - 10, startHeight + (j + 3) * rowheight - 25);
graphics.drawString(Strings.sNull(map.get("wx_name")), startWidth + (colwidth / 2) - 10, startHeight + (j + 3) * rowheight - 10);
graphics.drawString(Strings.sNull(map.get("url_times")) + "/" + Strings.sNull(map.get("url_num")), startWidth + colwidth2 + colwidth + 10, startHeight + (j + 3) * rowheight - 15);
if (NumberUtils.toInt(Strings.sNull(map.get("url_num_10w"))) > 0) {
String readnum_all = Strings.sNull(map.get("readnum_all"));
int t = NumberUtils.toInt(readnum_all.substring(readnum_all.length() - 4, readnum_all.length() - 3));
if (t > 0) {
readnum_all = readnum_all.substring(0, readnum_all.length() - 4) + "." + String.valueOf(t);
} else {
readnum_all = readnum_all.substring(0, readnum_all.length() - 4);
}
graphics.drawString(readnum_all + "万+", startWidth + colwidth2 + colwidth * 2 + 5, startHeight + (j + 3) * rowheight - 15);
} else {
graphics.drawString(Strings.sNull(map.get("readnum_all")), startWidth + colwidth2 + colwidth * 2 + 5, startHeight + (j + 3) * rowheight - 15);
}
if (NumberUtils.toInt(Strings.sNull(map.get("url_times_readnum"))) > 100000) {
String url_times_readnum = Strings.sNull(map.get("url_times_readnum"));
int t = NumberUtils.toInt(url_times_readnum.substring(url_times_readnum.length() - 4, url_times_readnum.length() - 3));
if (t > 0) {
url_times_readnum = url_times_readnum.substring(0, url_times_readnum.length() - 4) + "." + String.valueOf(t);
} else {
url_times_readnum = url_times_readnum.substring(0, url_times_readnum.length() - 4);
}
graphics.drawString(url_times_readnum+"万+", startWidth + colwidth2 + colwidth * 3 - 5, startHeight + (j + 3) * rowheight - 15);
} else {
graphics.drawString(Strings.sNull(map.get("url_times_readnum")), startWidth + colwidth2 + colwidth * 3 - 5, startHeight + (j + 3) * rowheight - 15);
}
if (NumberUtils.toInt(Strings.sNull(map.get("readnum_av"))) > 100000) {
String readnum_av = Strings.sNull(map.get("readnum_av"));
int t = NumberUtils.toInt(readnum_av.substring(readnum_av.length() - 4, readnum_av.length() - 3));
if (t > 0) {
readnum_av = readnum_av.substring(0, readnum_av.length() - 4) + "." + String.valueOf(t);
} else {
readnum_av = readnum_av.substring(0, readnum_av.length() - 4);
}
graphics.drawString(readnum_av+"万+", startWidth + colwidth2 + colwidth * 4 - 15, startHeight + (j + 3) * rowheight - 15);
} else {
graphics.drawString(Strings.sNull(map.get("readnum_av")), startWidth + colwidth2 + colwidth * 4 - 15, startHeight + (j + 3) * rowheight - 15);
}
graphics.drawString(Strings.sNull(map.get("likenum_all")), startWidth + colwidth2 + colwidth * 5 - 20, startHeight + (j + 3) * rowheight - 15);
graphics.drawString(Strings.sNull(map.get("wci")), startWidth + colwidth2 + colwidth * 6 - 40, startHeight + (j + 3) * rowheight - 15);
}
//末行
graphics.setColor(Color.WHITE);
graphics.fillRect(startWidth, startHeight + (totalrow + 1) * rowheight + 40, imageWidth - 20, startHeight + (totalrow + 1) * rowheight);
try {
response.setContentType("image/png");
OutputStream out = response.getOutputStream();
ImageIO.write(image, "png", out);
} catch (Exception e) {
e.printStackTrace();
}
}