大家好,小弟最近在使用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();
}
}
}
补充:请问这到底是什么原因啊,麻烦诸位了,谢谢!
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();
}
}
}
补充:请问这到底是什么原因啊,麻烦诸位了,谢谢!
用poi读取文本的东西好,如果遇到office文档包含图片多媒体这些东西 ,还是建议直接在windows上调用com组建逼近这是微软的产品。