使用poi解析excel中图片的时候包ArrayIndexOutOfBoundsException
大家好,小弟最近在使用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();
}
}
}
补充:请问这到底是什么原因啊,麻烦诸位了,谢谢!