java的学习是一个漫长而又反复的过程,这往往要求学习的人全力以赴地投入进去,才能有所收获。今天就来为大家介绍java中Excel使用图形的操作方法,并且通过生动的图片和详细的代码来为大家展示。
一、首先要介绍的是画线,代码展示如下:
HSSFSheet sheet = workbook.createSheet("Test"); // 创建工作表(Sheet) HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 0, (short) 4, 4); HSSFSimpleShape line = patriarch.createSimpleShape(anchor); line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); //设置图形类型 line.setLineStyle(HSSFShape.LINESTYLE_SOLID); //设置图形样式 line.setLineWidth(6350); //在POI中线的宽度12700表示1pt,所以这里是0.5pt粗的线条。
图片如下:
另外需要补充的是,用POI画图主要有下面几步:
⑴创建一个Patriarch;
⑵创建一个Anchor,用来确定图形的位置;
⑶调用Patriarch创建图形;
⑷设置图形类型(直线,矩形,圆形等)及样式(颜色,粗细等)。
另外关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数,也为大家做一个简要的说明:
①dx1:起始单元格的x偏移量,如例子中的0表示直线起始位置距B 1单元格左侧的距离;
②dy1:起始单元格的y偏移量,如例子中的0表示直线起始位置距B 1单元格上侧的距离;
③dx2:终止单元格的x偏移量,如例子中的0表示直线起始位置距E 5单元格左侧的距离;
④dy2:终止单元格的y偏移量,如例子中的0表示直线起始位置距E 5单元格上侧的距离;
⑤col1:起始单元格列序号,从0开始计算;
⑥row1:起始单元格行序号,从0开始计算,如例子中col1=1,row1=0就表示起始单元格为B 1;
⑦col2:终止单元格列序号,从0开始计算;
⑧row2:终止单元格行序号,从0开始计算,如例子中col2=4,row2=4就表示起始单元格为E 5;
而且关于LineStyle属性,它的可选值对应的效果如下图所示:
二、画矩形,代码展示如下:
HSSFSheet sheet = workbook.createSheet("Test"); // 创建工作表(Sheet) HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(255, 122, 255, 122, (short) 1, 0, (short) 4, 3); HSSFSimpleShape rec = patriarch.createSimpleShape(anchor); rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE); rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); //设置边框样式 rec.setFillColor(255, 0, 0); //设置填充色 rec.setLineWidth(25400); //设置边框宽度 rec.setLineStyleColor(0, 0, 255); //设置边框颜色
图片如下所示:
三、画圆形,代码展示如下:
rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); //设置图片类型
图片如下:
四、画Grid
在POI中,本来是没有画Grid(网格)的方法。但可以通过画线的方式来模拟画Grid,代码展示如下:
HSSFSheet sheet = workbook.createSheet("Test"); // 创建工作表(Sheet) HSSFRow row = sheet.createRow(2); row.createCell(1); row.setHeightInPoints(240); sheet.setColumnWidth(2, 9000); int linesCount = 20; HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //因为HSSFClientAnchor中dx只能在0-1023之间,dy只能在0-255之间,这里采用比例的方式 double xRatio = 1023.0 / (linesCount * 10); double yRatio = 255.0 / (linesCount * 10); // 画竖线 int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 200; for (int i = 0; i < linesCount; i++) { HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int)(x1 * xRatio) , (int)(y1 * yRatio), (short) 2, 2, (int)(x2 * xRatio) , (int)(y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); x1 += 10; x2 += 10; } // 画横线 x1 = 0; y1 = 0; x2 = 200; y2 = 0; for (int i = 0; i < linesCount; i++) { HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int)(x1 * xRatio) , (int)(y1 * yRatio), (short) 2, 2, (int)(x2 * xRatio) , (int)(y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); y1 += 10; y2 += 10; }
图片如下:
五、插入图片,代码展示如下:
HSSFSheet sheet = workbook.createSheet("Test"); // 创建工作表(Sheet) FileInputStream stream = newFileInputStream("d:\\POI\\Apache.gif"); byte[] bytes = new byte[(int) stream.getChannel() .size()]; stream.read(bytes); //读取图片到二进制数组 int pictureIdx = workbook.addPicture(bytes, HSSFWorkbook.PICTURE_TYPE_JPEG); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 0, 0, (short) 5, 5); HSSFPicture pict = patriarch.createPicture(anchor, pictureIdx); //pict.resize();//自动调节图片大小,图片位置信息可能丢失
图片如下:
六、从Excel文件提取图片,代码展示如下:
InputStream inp = new FileInputStream(filePath); HSSFWorkbook workbook = new HSSFWorkbook(inp); //读取现有的Excel文件 List < HSSFPictureData > pictures = workbook.getAllPictures(); for (int i = 0; i < pictures.size(); i++) { HSSFPictureData pic = pictures.get(i); String ext = pic.suggestFileExtension(); if (ext.equals("png")) //判断文件格式 { FileOutputStream png = newFileOutputStream("d:\\POI\\Apache.png"); png.write(pic.getData()); png.close(); //保存图片 } }
以上就是关于在java中Excel使用图形的操作方法,并且通过图片和代码为大家展示。想要了解更多java经典例子,敬请关注奇Q工具网。
推荐阅读: