20151 月28
Nutz:通过Java代码生成表格图片
效果图:
源码不解释:
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(); } }