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
This commit is contained in:
parent
4b20a61ad7
commit
f524f28579
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user