大家好,小弟最近在使用poi 解析excel的时候,碰到一个很奇怪的问题,使用HSSFSheet.getDrawingPatriarch()时,会报以下异常:
 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
 at java.lang.System.arraycopy(Native Method)
 at org.apache.poi.ddf.EscherPropertyFactory.createProperties(EscherPropertyFactory.java:85)
 at org.apache.poi.ddf.AbstractEscherOptRecord.fillFields(AbstractEscherOptRecord.java:54)
 at org.apache.poi.ddf.EscherContainerRecord.fillFields(EscherContainerRecord.java:53)
 at org.apache.poi.ddf.EscherContainerRecord.fillFields(EscherContainerRecord.java:53)
 at org.apache.poi.ddf.EscherContainerRecord.fillFields(EscherContainerRecord.java:53)
 at org.apache.poi.hssf.record.EscherAggregate.createAggregate(EscherAggregate.java:386)
 at org.apache.poi.hssf.model.InternalSheet.aggregateDrawingRecords(InternalSheet.java:1539)
 at org.apache.poi.hssf.usermodel.HSSFSheet.getDrawingEscherAggregate(HSSFSheet.java:1709)
 at org.apache.poi.hssf.usermodel.HSSFSheet.getDrawingPatriarch(HSSFSheet.java:1737)
 at com.chenhao.test.ReadPicTureFromExcel.main(ReadPicTureFromExcel.java:33)
 下面是代码:
 
package com.chenhao.test;
 
import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
 import org.apache.poi.hssf.usermodel.HSSFPicture;
 import org.apache.poi.hssf.usermodel.HSSFPictureData;
 import org.apache.poi.hssf.usermodel.HSSFShape;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
 
public class ReadPicTureFromExcel {
 
public static void main(String[] args) throws InvalidFormatException, IOException {
 //关联excel文件
InputStream in = new FileInputStream("d:/bendan.xls"); //生成HSSFWorkbook 
 HSSFWorkbook workbook = (HSSFWorkbook) WorkbookFactory.create(in); int sheetNums = workbook.getNumberOfSheets();//得到工作簿中所有的表数目for(int j = 0 ; j< sheetNums; j++){
 HSSFSheet sheet = workbook.getSheetAt(j);
 int i = 0;
if(sheet.getDrawingPatriarch() == null){//执行到这句的时候就抛出异常。
return;
 }
 if(sheet.getDrawingPatriarch().getChildren().size() > 0 && sheet.getDrawingPatriarch().getChildren() != null){
 List<HSSFShape> shapes = sheet.getDrawingPatriarch().getChildren();
 //遍历工作表中的图形
for(HSSFShape shape : shapes){
 //得到图形对应的锚点
HSSFClientAnchor  anchor = (HSSFClientAnchor) shape.getAnchor(); //判断图形元素是否是图片对象
if(shape instanceof HSSFPicture){
 //如果是则强制转换成图片对象
HSSFPicture pic = (HSSFPicture) shape; //得到锚点的行号
int row  = anchor.getRow1(); //起始行号
System.out.println(i + "----->" + row + ":" + anchor.getCol1()); //结束行号
System.out.println(i + "----->" + anchor.getRow2() + ":" + anchor.getCol2()); HSSFPictureData picData = pic.getPictureData(); int pictureIndex  = pic.getPictureIndex()-1; System.out.println(i + "----->" + pictureIndex);
 savePic(i,picData,j);
 }
 i++; }
 } }
 }
 /**
  * @param row 图片的序号
 * @param picData 图片的内容
 * @param j 对应的那张sheet表
 * @throws IOException
  */
 private static void savePic(int row, HSSFPictureData picData, int j) throws IOException {
 String ext = picData.suggestFileExtension(); byte[] data = picData.getData(); if(ext.equals("jpeg")){
 File picFile = new File("d:/pics/sheet"+j+"/" + row +".jpg");
 if(!picFile.exists()){
 picFile.getParentFile().mkdirs();
 }
 FileOutputStream out = new FileOutputStream(picFile);
 out.write(data);
 out.close();
 } if(ext.equals("png")){
 File picFile = new File("d:/pics/sheet"+j+"/" + row +".png");
 if(!picFile.exists()){
 picFile.getParentFile().mkdirs();
 }
 FileOutputStream out = new FileOutputStream(picFile);
 out.write(data);
 out.close();
 }
 }
 }
 
补充:请问这到底是什么原因啊,麻烦诸位了,谢谢!