1.说明
最近,项目上有需求,需要从数据库读取数据,然后将数据以表格的形式放到word的文档中。在表格上,需要展示出一个月的工作时间的数据。同时,有些单元格有相同值时,需要做合并处理。
2.思路
从需求上可以看出,首先要生成一份数据,并且是表格的;其次,表格的的总价单元格需要合并;最后,要将表格放入到word的文档中。之前,想过直接将第一步和第二步省略掉,也就是直接在word的文档上画出表格。但是由于数据量过多,所以画出的表格不好看,且太密集了。因此,最后的思路是,先将数据生成一份表格图片,然后再将图片放入到word的文件中。有了这个思路,然后就要想,要如何将数据生成表格图片,用什么技术来实现。为了可以更快的实现这个功能,最后笔者采用的是java的Graphics接口来实现。
3.部分代码
3.1定义设置样式的类
创建一个类,主要是用于设置表格的样式,包括生成图片的大小,还有表格的字体等。
这个类,可以自己设置,有些值是默认的,只是为了如果没有自定义时,可以使用默认的值。
以下是部分代码:
/**报表图片的色彩质量类型,默认为 BufferedImage.TYPE_INT_RGB */
public int imageType=BufferedImage.TYPE_INT_RGB;
/**报表图片宽度,单位为px,默认为600px */
public int imgWidth=600;
/**报表图片高度,单位为px,默认为300px */
public int imgHeight=300;
/**报表横向标题行数,默认为1行 */
public int titleRowCnt=1;
/**报表纵向标题行数,默认为1列 */
public int titleColCnt=1;
/**报表标题字体名称,默认为“SansSerif”,字体可选范围为当前使用环境虚拟机内字体范围 */
public String titleFontName = "SansSerif" ;
/**报表标题字体样式,默认为BOLD,字体样式可选范围为当前使用环境虚拟机内字体样式范围 */
public int titleFontStyle = Font.BOLD ;
/**报表标题字体大小,单位为px,默认为14px */
public int titleFontSize = 14 ;
/**报表内容字体名称,默认为“SansSerif”,字体可选范围为当前使用环境虚拟机内字体范围 */
public String contentFontName = "SansSerif" ;
/**报表内容字体样式,默认为PLAIN,字体样式可选范围为当前使用环境虚拟机内字体样式范围 */
public int contentFontStyle = Font.PLAIN ;
/**报表内容字体大小,单位为px,默认为14px */
public int contentFontSize = 14 ;
/**报表标题单元格背景颜色,默认为RGB色(209,247,255) */
public Color titleCellBackgroundColor = new Color(209,247,255);
/**报表标题字体颜色,默认为RGB色(0,0,0) */
public Color titleFontColor = new Color(0,0,0);
/**报表内容单元格背景颜色,默认为RGB色(255,255,255) */
public Color contentCellBackgroundColor = new Color(255,255,255);
/**报表标题字体颜色,默认为RGB色(0,0,0) */
public Color contentFontColor = new Color(0,0,0);
/**报表单元格线条颜色,默认为RGB色(0,0,0) */
public Color cellLineColor = new Color(0,0,0);
/**报表图片格式,默认为存贮体积较小的PNG格式 */
public String imageFileType = "PNG";
/**报表图片合并单元格配置对象 */
public ReportImageMergeCell reportImageMergeCell = new ReportImageMergeCellDefaultImp();
/**报表图片动态颜色配置对象 */
public ReportImageDynamicColor reportImageDynamicColor = new ReportImageDynamicColorDefaultImp();
3.2画线条
使用Graphics生成单元格,需要我们自己画出横线和纵线,这样就构成子一张表格。需要注意的是,需要先写内容,然后再画出表格,不然的话,表格会被内容覆盖。代码如下:
/**设置绘制单元格线颜色,*/
graphics.setColor(cellLineColor);
/**绘制单元格线条*/
for (int x = 0; x <= imgWidth; x+=cellWidth) {
/**循环绘制单元格纵向线条*/
graphics.drawLine(x , 0, x, imgHeight);
/**首次循环时绘制单元格横向线条*/
for (int y = 0; x==0 && y <= imgHeight; y+=cellHeight) {