title: Creating Chart in Excel using Jfreechart and poi in java
body: <p>This is the error I'm getting..</p>
  
  <pre><code>Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 1
          at java.util.ArrayList.RangeCheck(ArrayList.java:547)
          at java.util.ArrayList.get(ArrayList.java:322)
          at org.apache.poi.hssf.model.DrawingManager2.getDrawingGroup(DrawingManager2.java:125)
          at org.apache.poi.hssf.model.DrawingManager2.allocateShapeId(DrawingManager2.java:71)
          at org.apache.poi.hssf.record.EscherAggregate.convertPatriarch(EscherAggregate.java:988)
          at org.apache.poi.hssf.record.EscherAggregate.convertUserModelToRecords(EscherAggregate.java:821)
          at org.apache.poi.hssf.record.EscherAggregate.getRecordSize(EscherAggregate.java:508)
          at org.apache.poi.hssf.model.InternalSheet.preSerialize(InternalSheet.java:1567)
          at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1285)
          at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1205)
          at NewTest.main(NewTest.java:94)
  </code></pre>
  
  <p>And here is the code..</p>
  
  <pre><code>import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.InputStream;
  import java.util.Iterator;
  
  import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
  import org.apache.poi.hssf.usermodel.HSSFPatriarch;
  import org.apache.poi.hssf.usermodel.HSSFPicture;
  import org.apache.poi.hssf.usermodel.HSSFSheet;
  import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  import org.apache.poi.ss.usermodel.Cell;
  import org.apache.poi.ss.usermodel.ClientAnchor;
  import org.apache.poi.ss.usermodel.Row;
  import org.apache.poi.ss.usermodel.Workbook;
  import org.apache.poi.util.IOUtils;
  import org.jfree.chart.ChartFactory;
  import org.jfree.chart.ChartUtilities;
  import org.jfree.chart.JFreeChart;
  import org.jfree.data.general.DefaultPieDataset;
  public class NewTest {  
          public static void main(String[] args) throws Exception{
  
                  /* Read Excel and the Chart Data */
                  FileInputStream chart_file_input = new FileInputStream("/home/prasanna/jfree.xls");
                  /* Read data into HSSFWorkbook */
                  HSSFWorkbook my_workbook = new HSSFWorkbook(chart_file_input);
                  /* This worksheet contains the Pie Chart Data */
                  HSSFSheet my_sheet = my_workbook.getSheetAt(0);
                  /* Create JFreeChart object that will hold the Pie Chart Data */
                  DefaultPieDataset my_pie_chart_data = new DefaultPieDataset();
                  /* We now iterate over the Excel Workbook data and Populate Pie Chart Data */
                  /* Create an Iterator object */
                  Iterator&lt;Row&gt; rowIterator = my_sheet.iterator(); 
                  /* Loop through worksheet data and populate Pie Chart Dataset */
                  String chart_label="a";
                  Number chart_data=0;            
                  while(rowIterator.hasNext()) {
                          //Read Rows from Excel document
                          Row row = rowIterator.next();  
                          //Read cells in Rows and get chart data
                          Iterator&lt;Cell&gt; cellIterator = row.cellIterator();
                                  while(cellIterator.hasNext()) {
                                          Cell cell = cellIterator.next(); 
                                          switch(cell.getCellType()) { 
                                          case Cell.CELL_TYPE_NUMERIC:
                                                  chart_data=cell.getNumericCellValue();
                                                  break;
                                          case Cell.CELL_TYPE_STRING:
                                                  chart_label=cell.getStringCellValue();
                                                  break;
                                          }
                                  }
                  /* Add data to the data set */          
                  my_pie_chart_data.setValue(chart_label,chart_data);
                  }               
                  /* Create a logical chart object with the chart data collected */
                  JFreeChart myPieChart=ChartFactory.createPieChart("Excel Pie Chart Java Example",my_pie_chart_data,true,true,false);
                  /* Specify the height and width of the Pie Chart */
                  int width=640; /* Width of the chart */
                  int height=480; /* Height of the chart */
                  float quality=1; /* Quality factor */
                  /* We don't want to create an intermediate file. So, we create a byte array output stream 
                  and byte array input stream
                  And we pass the chart data directly to input stream through this */             
                  /* Write chart as JPG to Output Stream */
                  ByteArrayOutputStream chart_out = new ByteArrayOutputStream();          
                  ChartUtilities.writeChartAsJPEG(chart_out,quality,myPieChart,width,height);
                  /* We now read from the output stream and frame the input chart data */
                  InputStream feed_chart_to_excel=new ByteArrayInputStream(chart_out.toByteArray());
                  byte[] bytes = IOUtils.toByteArray(feed_chart_to_excel);
                  /* Add picture to workbook */
                  int my_picture_id = my_workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
                  /* We can close Piped Input Stream. We don't need this */
                  feed_chart_to_excel.close();
                  /* Close PipedOutputStream also */
                  chart_out.close();
                  /* Create the drawing container */
                  HSSFPatriarch drawing = my_sheet.createDrawingPatriarch();
                  /* Create an anchor point */
                  ClientAnchor my_anchor = new HSSFClientAnchor();
                  /* Define top left corner, and we can resize picture suitable from there */
                  my_anchor.setCol1(4);
                  my_anchor.setRow1(5);
                  /* Invoke createPicture and pass the anchor point and ID */
                  HSSFPicture  my_picture = drawing.createPicture(my_anchor, my_picture_id);
                  /* Call resize method, which resizes the image */
                  my_picture.resize();
                  /* Close the FileInputStream */
                  String file = "/home/prasanna/picture.xls";
                     //if(wb instanceof XSSFWorkbook) file += "x";
                  FileOutputStream out = new FileOutputStream(file);
                  my_workbook.write(out);
                  out.close();            
          }
  }
  </code></pre>