使用poi解析excel中图片的时候包ArrayIndexOutOfBoundsException

windkisshao 2013-05-10 05:59:46
大家好,小弟最近在使用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();
}
}
}

补充:请问这到底是什么原因啊,麻烦诸位了,谢谢!
...全文
344 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
OrpheusWen 2013-05-10
  • 打赏
  • 举报
回复
poi现在还不完整。你去看那个项目好多代码都只是个接口。我也遇到过,这问题。最终 还是放弃了。poi 用poi读取文本的东西好,如果遇到office文档包含图片多媒体这些东西 ,还是建议直接在windows上调用com组建。。。逼近这是微软的产品。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧