JAVA将Excel中的报表导出为图片格式(二)实现思路
来源:互联网 发布:美国大学网络教育 编辑:程序博客网 时间:2024/06/07 16:00
接上文,一封类似于下方设计的Excel报表,如何将它指定的区域导出为样式一模一样的JPG图片呢?
要实现这个功能没有现成的解决方案,谷歌度娘了好久也没有,最终自己想了几条思路:
思路1:将报表中的背景、边框等截图下来作为模型图片,需要定时更新的数据通过JDBC读取Oracle中的数据绘制到模型图片上
否定原因:不具可行性,所有数据的坐标点需要有规则方便绘图时循环绘制,工程量巨大,耦合性巨高,表格数据牵一发而动全身,并且不利于扩展。
思路2:不需要报表原型,生成Excel报表后,使用jxl或者poi一个单元一个单元读取报表内所有单元格,包括单元格的数据和格式,边框、宽度、高度、字体前景色、背景色都要读取出来,然后通过JAVA绘图,最终生成JPG格式的报表。
否定原因:具有一定的可行性,但是代码量巨大,读取和绘制费时费力,但是有一定的优点,可以在不忙的时间里编写一个通用的程序,一劳永逸的解决所有导出问题。
思路3:比较奇葩,属于博主突发奇想的招式,通过WPS或者Office打开Excel,编写Robot机器人将鼠标移动到两个指定坐标所覆盖指定区域,Robot模拟敲击Ctrl+C,接着将剪贴板上的数据绘图,导出到JPG文件。
最终实现了思路3,有一定的好处也有弊端,好处是简单便捷,可操作性高,代码量低,扩展性强,换其他报表只需要提供另一组坐标参数即可
弊端是完全牺牲了JAVA的跨平台性,甚至如果运行在分辨率较低的服务器上,有可能导致复制操作无法执行
另一个弊端是线程变得不安全了,如果服务器负载较重,无法正确预计Office打开报表的时间,也有可能导致复制操作无法执行
或者多个生成报表截图的任务同时执行时,显然使用Robot会导致冲突。
下面提供思路3的实现代码,以后有时间会使用思路2写一个通用的程序
package com.newflypig.excel;import java.awt.Graphics;import java.awt.Image;import java.awt.Robot;import java.awt.Toolkit;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.image.BufferedImage;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;import javax.imageio.ImageIO;public class OpenExcelDemo {public static void main(String[] args) throws Exception {openExcel("d:\\新增积分月报表.xlsx");copyRectByPix(37, 207, 1215, 665);createImageFileFromClip("d:/" + getTimeStr() + ".jpg");closeExcel((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() - 15, 12);}private static void closeExcel(int i, int j) throws Exception {Robot robot = new Robot();robot.delay(500);robot.mouseMove(i,j);robot.delay(500);robot.mousePress(InputEvent.BUTTON1_MASK);robot.delay(500);robot.mouseRelease(InputEvent.BUTTON1_MASK);robot.delay(500);robot.keyPress(KeyEvent.VK_ENTER);}public static void openExcel(String dir) throws Exception {Runtime.getRuntime().exec("cmd /k " + dir + "");}public static void copyRectByPix(int fromX, int fromY, int toX, int toY)throws Exception {Robot robot = new Robot();robot.delay(3000); // 延时3000毫秒robot.mouseMove(fromX, fromY);robot.delay(500);robot.mousePress(InputEvent.BUTTON1_MASK);robot.delay(500);robot.mouseMove(toX, toY);robot.delay(500);robot.mouseRelease(InputEvent.BUTTON1_MASK);robot.setAutoDelay(200);robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_C);robot.keyRelease(KeyEvent.VK_CONTROL);robot.keyRelease(KeyEvent.VK_C);}public static void createImageFileFromClip(String dir) throws Exception {Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);if (null != t && t.isDataFlavorSupported(DataFlavor.imageFlavor)) {Image image = (Image) t.getTransferData(DataFlavor.imageFlavor);savePic(image, dir);}}public static String savePic(Image iamge, String dir) throws Exception {int w = iamge.getWidth(null);int h = iamge.getHeight(null);// 首先创建一个BufferedImage变量,因为ImageIO写图片用到了BufferedImage变量。BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);// 再创建一个Graphics变量,用来画出来要保持的图片,及上面传递过来的Image变量Graphics g = bi.getGraphics();g.drawImage(iamge, 0, 0, null);// 将BufferedImage变量写入文件中。ImageIO.write(bi, "jpg", new File(dir));return dir;}public static String getTimeStr() {String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());return time;}}
- JAVA将Excel中的报表导出为图片格式(二)实现思路
- JAVA将Excel中的报表导出为图片格式(三)换一种实现
- JAVA将Excel中的报表导出为图片格式(一)问题背景
- C# 将内存中的datatable数据导出为Excel(方法二,创建Excel对象导出)
- Java操作Excel(二)将数据库中的数据导出到Excel中
- Java操作Excel(二)将数据库中的数据导出到Excel中
- javaweb项目-将数据导出为excel文件思路总结
- Java实现POI导出Excel报表功能
- 将ListView中的记录导出为Excel
- 导出报表到excel(二)
- java 导出 Excel 报表
- 报表导出Excel 二 :将业务报表数据写入特定Excel模板
- php导出报表为excel
- JAVA POI 导出EXCEL: 代码中不需关心excel样式格式的实现思路 (反射)
- 水晶报表导出为pdf, word , excel 格式(已经测试过,实现了该功能)
- 报表excel导出实现代码
- JAVA 高级报表导出Excel
- java 导出报表到excel
- php手机号中间几位替换成星号
- n后问题
- C++基类与派生类的转换
- Servlet 的配置
- 【Python多进程库】一个函数让你设置CPU数和线程数
- JAVA将Excel中的报表导出为图片格式(二)实现思路
- ajax跨域解决方案
- 聊聊并发-Java中的Copy-On-Write容器
- UVA 400 UNIX ls
- 如何思考问题
- C#学习之 调用 AForge.NET Framework 启动摄像头
- JSP/Servlet-----web.xml配置
- MD5学习
- android 文件读写总结