From f524f28579136570544aaf905322c47f9c2ae0e4 Mon Sep 17 00:00:00 2001 From: Glen Stampoultzis Date: Tue, 10 Feb 2004 22:06:52 +0000 Subject: [PATCH] Examples of how to draw pictures in Excel git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/branches/REL_2_BRANCH@353501 13f79535-47bb-0310-9956-ffa450edef68 --- .../usermodel/examples/OfficeDrawing.java | 255 ++++++++++++++++++ .../examples/OfficeDrawingWithGraphics.java | 87 ++++++ 2 files changed, 342 insertions(+) create mode 100644 src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawing.java create mode 100644 src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawingWithGraphics.java diff --git a/src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawing.java b/src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawing.java new file mode 100644 index 000000000..255fed7cb --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawing.java @@ -0,0 +1,255 @@ +package org.apache.poi.hssf.usermodel.examples; + +import org.apache.poi.hssf.usermodel.*; + +import java.io.IOException; +import java.io.FileOutputStream; +import java.io.FileNotFoundException; + +/** + * Demonstrates how to use the office drawing capabilities of POI. + * + * @author Glen Stampoultzis (glens at apache.org) + */ +public class OfficeDrawing +{ + public static void main(String[] args) + throws IOException + { + // Create the workbook and sheets. + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet sheet1 = wb.createSheet("new sheet"); + HSSFSheet sheet2 = wb.createSheet("second sheet"); + HSSFSheet sheet3 = wb.createSheet("third sheet"); + HSSFSheet sheet4 = wb.createSheet("fourth sheet"); + + // Draw stuff in them + drawSheet1( sheet1 ); + drawSheet2( sheet2 ); + drawSheet3( sheet3 ); + drawSheet4( sheet4, wb ); + + // Write the file out. + FileOutputStream fileOut = new FileOutputStream("workbook.xls"); + wb.write(fileOut); + fileOut.close(); + } + + private static void drawSheet1( HSSFSheet sheet1 ) + { + // Create a row and size one of the cells reasonably large. + HSSFRow row = sheet1.createRow(2); + row.setHeight((short) 2800); + sheet1.setColumnWidth((short) 2, (short) 9000); + + // Create the drawing patriarch. This is the top level container for + // all shapes. + HSSFPatriarch patriarch = sheet1.createDrawingPatriarch(); + + // Draw some lines and an oval. + drawLinesToCenter( patriarch ); + drawManyLines( patriarch ); + drawOval( patriarch ); + drawPolygon( patriarch ); + + // Draw a rectangle. + HSSFSimpleShape rect = patriarch.createSimpleShape( new HSSFClientAnchor(100, 100, 900, 200, (short)0, 0, (short)0, 0) ); + rect.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE); + } + + private static void drawSheet2( HSSFSheet sheet2 ) + { + // Create a row and size one of the cells reasonably large. + HSSFRow row = sheet2.createRow(2); + row.setHeightInPoints(240); + sheet2.setColumnWidth((short) 2, (short) 9000); + + // Create the drawing patriarch. This is the top level container for + // all shapes. This will clear out any existing shapes for that sheet. + HSSFPatriarch patriarch = sheet2.createDrawingPatriarch(); + + // Draw a grid in one of the cells. + drawGrid( patriarch ); + } + + private static void drawSheet3( HSSFSheet sheet3 ) + { + // Create a row and size one of the cells reasonably large + HSSFRow row = sheet3.createRow(2); + row.setHeightInPoints(140); + sheet3.setColumnWidth((short) 2, (short) 9000); + + // Create the drawing patriarch. This is the top level container for + // all shapes. This will clear out any existing shapes for that sheet. + HSSFPatriarch patriarch = sheet3.createDrawingPatriarch(); + + // Create a shape group. + HSSFShapeGroup group = patriarch.createGroup( + new HSSFClientAnchor(0,0,900,200,(short)2,2,(short)2,2)); + + // Create a couple of lines in the group. + HSSFSimpleShape shape1 = group.createShape(new HSSFChildAnchor(3,3,500,500)); + shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); + ( (HSSFChildAnchor) shape1.getAnchor() ).setAnchor((short)3,3,500,500); + HSSFSimpleShape shape2 = group.createShape(new HSSFChildAnchor((short)1,200,400,600)); + shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); + + } + + private static void drawSheet4( HSSFSheet sheet4, HSSFWorkbook wb ) + { + // Create the drawing patriarch. This is the top level container for + // all shapes. This will clear out any existing shapes for that sheet. + HSSFPatriarch patriarch = sheet4.createDrawingPatriarch(); + + // Create a couple of textboxes + HSSFTextbox textbox1 = patriarch.createTextbox( + new HSSFClientAnchor(0,0,0,0,(short)1,1,(short)2,2)); + textbox1.setString(new HSSFRichTextString("This is a test") ); + HSSFTextbox textbox2 = patriarch.createTextbox( + new HSSFClientAnchor(0,0,900,100,(short)3,3,(short)3,4)); + textbox2.setString(new HSSFRichTextString("Woo") ); + textbox2.setFillColor(200,0,0); + textbox2.setLineStyle(HSSFSimpleShape.LINESTYLE_DOTGEL); + + // Create third one with some fancy font styling. + HSSFTextbox textbox3 = patriarch.createTextbox( + new HSSFClientAnchor(0,0,900,100,(short)4,4,(short)5,4+1)); + HSSFFont font = wb.createFont(); + font.setItalic(true); + font.setUnderline(HSSFFont.U_DOUBLE); + HSSFRichTextString string = new HSSFRichTextString("Woo!!!"); + string.applyFont(2,5,font); + textbox3.setString(string ); + textbox3.setFillColor(0x08000030); + textbox3.setLineStyle(HSSFSimpleShape.LINESTYLE_NONE); // no line around the textbox. + textbox3.setNoFill(true); // make it transparent + } + + private static void drawOval( HSSFPatriarch patriarch ) + { + // Create an oval and style to taste. + HSSFClientAnchor a = new HSSFClientAnchor(); + a.setAnchor((short)2, 2, 20, 20, (short) 2, 2, 190, 80); + HSSFSimpleShape s = patriarch.createSimpleShape(a); + s.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); + s.setLineStyleColor(10,10,10); + s.setFillColor(90,10,200); + s.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3); + s.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); + } + + private static void drawPolygon( HSSFPatriarch patriarch ) + { + // HSSFClientAnchor a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 2, 2, (short) 3, 3 ); + // HSSFPolygon p = patriarch.createPolygon(a); + // p.setPolygonDrawArea(100,100); + // p.setPoints( new int[]{30, 90, 50}, new int[]{88, 5, 44} ); + + + HSSFClientAnchor a = new HSSFClientAnchor(); + a.setAnchor( (short) 2, 2, 0, 0, (short) 3, 3, 1023, 255 ); + HSSFShapeGroup g = patriarch.createGroup( a ); + g.setCoordinates(0,0,200,200); + HSSFPolygon p1 = g.createPolygon( new HSSFChildAnchor( 0, 0, 200, 200 ) ); + p1.setPolygonDrawArea( 100, 100 ); + p1.setPoints( new int[]{0, 90, 50}, new int[]{5, 5, 44} ); + p1.setFillColor( 0, 255, 0 ); + HSSFPolygon p2 = g.createPolygon( new HSSFChildAnchor( 20, 20, 200, 200 ) ); + p2.setPolygonDrawArea( 200, 200 ); + p2.setPoints( new int[]{120, 20, 150}, new int[]{105, 30, 195} ); + p2.setFillColor( 255, 0, 0 ); + } + + private static void drawManyLines( HSSFPatriarch patriarch ) + { + // Draw bunch of lines + int x1 = 100; + int y1 = 100; + int x2 = 800; + int y2 = 200; + int color = 0; + for (int i = 0; i < 10; i++) + { + HSSFClientAnchor a2 = new HSSFClientAnchor(); + a2.setAnchor((short) 2, 2, x1, y1, (short) 2, 2, x2, y2); + HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); + shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); + shape2.setLineStyleColor(color); + y1 -= 10; + y2 -= 10; + color += 30; + } + } + + private static void drawGrid( HSSFPatriarch patriarch ) + { + // This draws a grid of lines. Since the coordinates space fixed at + // 1024 by 256 we use a ratio to get a reasonably square grids. + + double xRatio = 3.22; + double yRatio = 0.6711; + + int x1 = 000; + int y1 = 000; + int x2 = 000; + int y2 = 200; + for (int i = 0; i < 20; 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 = 000; + y1 = 000; + x2 = 200; + y2 = 000; + for (int i = 0; i < 20; 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; + } + } + + private static void drawLinesToCenter( HSSFPatriarch patriarch ) + { + // Draw some lines from and to the corners + { + HSSFClientAnchor a1 = new HSSFClientAnchor(); + a1.setAnchor( (short)2, 2, 0, 0, (short) 2, 2, 512, 128); + HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1); + shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); + } + { + HSSFClientAnchor a1 = new HSSFClientAnchor(); + a1.setAnchor( (short)2, 2, 512, 128, (short) 2, 2, 1024, 0); + HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1); + shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); + } + { + HSSFClientAnchor a1 = new HSSFClientAnchor(); + a1.setAnchor( (short)1, 1, 0, 0, (short) 1, 1, 512, 100); + HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1); + shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); + } + { + HSSFClientAnchor a1 = new HSSFClientAnchor(); + a1.setAnchor( (short)1, 1, 512, 100, (short) 1, 1, 1024, 0); + HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1); + shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); + } + + } +} diff --git a/src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawingWithGraphics.java b/src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawingWithGraphics.java new file mode 100644 index 000000000..0c54b0f19 --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/usermodel/examples/OfficeDrawingWithGraphics.java @@ -0,0 +1,87 @@ +package org.apache.poi.hssf.usermodel.examples; + +import org.apache.poi.hssf.usermodel.*; + +import java.awt.*; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Demonstrates the use of the EscherGraphics2d library. + * + * @author Glen Stampoultzis (glens at apache.org) + */ +public class OfficeDrawingWithGraphics +{ + public static void main( String[] args ) throws IOException + { + // Create a workbook with one sheet and size the first three somewhat + // larger so we can fit the chemical structure diagram in. + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet sheet = wb.createSheet( "my drawing" ); + sheet.setColumnWidth((short)1, (short)(256 * 27)); + HSSFRow row1 = sheet.createRow(0); + row1.setHeightInPoints(10 * 15); + HSSFRow row2 = sheet.createRow(1); + row2.setHeightInPoints(5 * 15); + HSSFRow row3 = sheet.createRow(2); + row3.setHeightInPoints(10 * 15); + + // Add some cells so we can test that the anchoring works when we + // sort them. + row1.createCell((short)0).setCellValue("C"); + row2.createCell((short)0).setCellValue("A"); + row3.createCell((short)0).setCellValue("B"); + + // Create the top level drawing patriarch. + HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); + + HSSFClientAnchor a; + HSSFShapeGroup group; + EscherGraphics g; + EscherGraphics2d g2d; + // Anchor entirely within one cell. + a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 ); + group = patriarch.createGroup( a ); + group.setCoordinates( 0, 0, 320, 276 ); + float verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet) / (float)Math.abs(group.getY2() - group.getY1()); + g = new EscherGraphics( group, wb, Color.black, verticalPointsPerPixel ); + g2d = new EscherGraphics2d( g ); + drawStar( g2d ); + + a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 1, (short) 1, 1 ); + group = patriarch.createGroup( a ); + group.setCoordinates( 0, 0, 640, 276 ); + verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet) / (float)Math.abs(group.getY2() - group.getY1()); +// verticalPixelsPerPoint = (float)Math.abs(group.getY2() - group.getY1()) / a.getAnchorHeightInPoints(sheet); + g = new EscherGraphics( group, wb, Color.black, verticalPointsPerPixel ); + g2d = new EscherGraphics2d( g ); + drawStar( g2d ); + + FileOutputStream out = new FileOutputStream("workbook.xls"); + wb.write(out); + out.close(); + + } + + private static void drawStar( EscherGraphics2d g2d ) + { + g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); + for (double i = 0; i < Math.PI; i += 0.1) + { + g2d.setColor( new Color((int)(i * 5343062d) ) ); + int x1 = (int) ( Math.cos(i) * 160.0 ) + 160; + int y1 = (int) ( Math.sin(i) * 138.0 ) + 138; + int x2 = (int) ( -Math.cos(i) * 160.0 ) + 160; + int y2 = (int) ( -Math.sin(i) * 138.0 ) + 138; + g2d.drawLine(x1,y1,x2,y2); + } + g2d.setFont(new Font("SansSerif",Font.BOLD | Font.ITALIC, 20)); + g2d.drawString("EscherGraphics2d",70,100); + g2d.setColor(Color.yellow); + g2d.fillOval( 160-20,138-20,40,40); + g2d.setColor(Color.black); + g2d.fillPolygon(new int[] {-10+160,0+160,10+160,0+160}, new int[] {0+138,10+138,0+138,-10+138}, 4); + g2d.drawPolygon(new int[] {-160+160,0+160,160+160,0+160}, new int[] {0+138,138+138,0+138,-138+138}, 4); + } +}