`

jxl.read.biff.SheetImpl.getCell中的ArrayIndexOutOfBoundsException异常

    博客分类:
  • Java
jxl 
阅读更多
有这么一个方法,用jxl包解析读取excel中值
public List getDataFromXLS(InputStream inputStream, boolean closeAFRead, String fileName, String dataClass, DictionaryBean dictBean) throws Exception {
		List list;
		Workbook workbook = null;
		try {
			IIntfConfigDAO intfConfigDAO = (IIntfConfigDAO) DAOFactory.getInstance().getDAO(IIntfConfigDAO.class);
			colMap = intfConfigDAO.getXLSConfig(fileName);
			workbook = Workbook.getWorkbook(inputStream);
			Sheet sheet = workbook.getSheet(0);
			int iCol = sheet.getColumns();
			int i = 0;
			allWidth = 400;
			//得到所有列的名称及对应关系
			for (i = 0; i < iCol; i++) {
				Cell cell = sheet.getCell(i, 0);
				if (cell == null)
					continue;
				String s = getCell(cell, "");
				XLSConfig config = (XLSConfig) colMap.get(s);
				if (config == null)
					continue;
				config.setColNum(i);
				//config.setWidth(sheet.getColumnView(i).getSize()/256*10);
				allWidth += config.getWidth();
			}
			//得到数据
			i = 1;
			list = new ArrayList();
			int iRow = sheet.getRows();  //修改
			while (true) {
				if (i >= iRow) {     //修改
					break;
				}
				Cell cell1 = sheet.getCell(0, i);
				Cell cell2 = sheet.getCell(1, i);
				Cell cell3 = sheet.getCell(2, i);
				if (cell1 == null && cell2 == null && cell3 == null)
					break;
				if (StringUtils.isNULLString(getCell(cell1, "")) && StringUtils.isNULLString(getCell(cell2, ""))
						&& StringUtils.isNULLString(getCell(cell3, ""))) {
					break;
				}
				Object obj = Class.forName(dataClass).newInstance();
				XLSCommObj xlsCommObj = (XLSCommObj) obj;
				for (Iterator iter = colMap.values().iterator(); iter.hasNext();) {
					XLSConfig config = (XLSConfig) iter.next();
					String xlsValue = null;
					if (config.getColNum() >= 0) {
						Cell cell = sheet.getCell(config.getColNum(), i);
						xlsValue = StringUtils.trim(getCell(cell, config.getMask()));
						BeanUtils.setProperty(obj, config.getFieldName(), xlsValue);
					}

					//取Key
					String key = xlsValue;
					String value = null;
					
					if(config.getColNum() == -1){
						xlsCommObj.addErrorMsg(config.getFieldName(), config.getColName() + " 列不存在");
						continue;
					}
					
					validateObj(xlsCommObj, config, key);

					if (StringUtils.isNULLString(xlsValue))
						continue;
					
					if ("1".equals(config.getFillWithCode())) {
						if (xlsValue.indexOf(BizConstants.XLS_FILED_SELECT_COMMA) < 0) {
							xlsCommObj.addinvalidErrorMsg(config.getFieldName(), config.getColName());
						}
						String[] keyValue = StringUtils.split(xlsValue, BizConstants.XLS_FILED_SELECT_COMMA);
						key = keyValue[0];
						value = keyValue[1];
					}

					if ("3".equals(config.getColType())) { //选择项自填
						boolean isFindKey = false;
						String[] dicKeyValue = StringUtils.split(config.getValueBound(), ";");
						if (!StringUtils.isNULLStringArray(dicKeyValue)) {
							for (int j = 0; j < dicKeyValue.length; j++) {
								String[] keyValue = StringUtils.split(dicKeyValue[j], BizConstants.XLS_FILED_SELECT_COMMA);
								if (StringUtils.equals(key, keyValue[0])) {
									isFindKey = true;
									value = keyValue[1];
									break;
								}
							}
						}
						if (!isFindKey) {
							xlsCommObj.addNoExistsErrorMsg(config.getFieldName(), config.getColName());
						}
					} else if ("4".equals(config.getColType())) { //选择项来自Dictionary
						value = dictBean.getLemmaValue(config.getValueBound(), key);
						if (StringUtils.isNULLString(value)) {
							xlsCommObj.addNoExistsErrorMsg(config.getFieldName(), config.getColName());
						}
					} else if ("5".equals(config.getColType())) { //选择项来自定义SQL语句
						value = intfConfigDAO.getCommSQLValue(config.getValueBound(), key);
						if (StringUtils.isNULLString(value)) {
							xlsCommObj.addNoExistsErrorMsg(config.getFieldName(), config.getColName());
						}
					}
					if (!StringUtils.isNULLString(config.getCodeField())) {
						BeanUtils.setProperty(obj, config.getCodeField(), key);
					}
					if (!StringUtils.isNULLString(config.getCospField())) {
						BeanUtils.setProperty(obj, config.getCospField(), value);
					}
					
				}
				validateObjOther(xlsCommObj);
				list.add(obj);
				i++;
			}
			return list;
		} catch (Exception e) {
			throw e;
		} finally {		
			if (workbook != null) workbook.close();
			if (closeAFRead) StreamUtils.closeInputStream(inputStream);
		}
	}
	


注释“//修改”是后来补充上去的值。如果没有这些判断,在读取excel对与某些模板会报错。

报错的模板统一特征就是没有限定记录数。也就是说,模板中定义了一些列,可能还为每列定义了格式,但是行数默认是65535(单个sheet最大记录数)。
对于jxl来说,对于不限定列数的情况下,它会自动筛选掉空的记录。也就是比如有一个上述的模板,含标题一共60行,则sheet.getRows()为40。当你getCell时,jxl会判断你的行列值是否在【sheet.getRows(), sheet.getColumns()】范围内,若大于它,则抛出数组下标越界异常。
所以在调用getCell(x,y)时,一定要注意取值范围。
分享到:
评论
3 楼 quake_thor 2013-09-14  
求大神帮忙
2 楼 quake_thor 2013-09-14  
excel sheet1 里面 有418行,180列
报错
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 113
at jxl.read.biff.SheetImpl.getCell(SheetImpl.java:344)
at Temp.main(Temp.java:26)
1 楼 quake_thor 2013-09-14  
import java.io.*;
import jxl.*;
import jxl.read.biff.BiffException;

public class Temp {
public static void main(String[] args) throws BiffException, IOException {

Sheet sheet;
Workbook book;
Cell cell[][] = new Cell[418][180];
int excel[][] = new int[418][180];
String str;

book = Workbook.getWorkbook(new File("file2.xls"));// 打开file2.xls

sheet = book.getSheet(0);// 获得第一个工作表对象(excel中sheet的编号从0开始)

int iRow = sheet.getRows();  //修改 
// 初始化excel数组
for (int i = 0; i < 180; i++) {
for (int a = 0; a < 418; a++) {
           if (i >= iRow) {     //修改 
                     break; 
                    }
   cell[a][i] = sheet.getCell(i, a);
// getCell(列,行)
str = cell[a][i].getContents();
excel[a][i] = Integer.parseInt(str);
       }
}
book.close();
}
}

相关推荐

    jxl.zip_excel_jxl_jxl.biff.drawing.dg_jxl.biff.drawingdg

    "jxl.biff.drawing.dg"和"jxl.biff.drawingdg"则涉及到Excel文件内部的结构,BIFF(Binary Interchange File Format)是Excel的二进制文件格式,其中"drawing"部分与Excel的图形元素相关,"dg"可能是Drawing Group的...

    jxl.jar包最新jar包亲测可用

    《使用jxl.jar包在Java中操作Excel文件的详尽指南》 在Java开发中,与Excel文件交互是一项常见的任务,比如数据导入、导出、分析等。jxl.jar库提供了一个强大的解决方案,使得开发者无需依赖Windows环境即可处理...

    解决JXL调用copySheet()和importSheet()方法时报异常的jar包

    今天调试了一下,发现在jxl.write.biff.WritableSheetCopier.shallowCopyCells方法中有如下代码 Java代码 if (c.getCellFeatures() != null & c.getCellFeatures().hasDataValidation()) { validatedCells....

    jxl.jar和jxl.api文档及使用方法

    它包含了一个名为`jxl.jar`的可执行Java档案,这个档案集成了JExcelAPI的所有类和方法,使得开发人员可以方便地在Java应用程序中读写Excel文件。描述进一步提到,还有`jxl.api`文档,这是JExcelAPI的API参考,提供了...

    jxl.jar完整包

    安装jxl.jar非常简单,只需将其添加到项目的类路径中。在Java代码中,我们可以使用以下方式引入: ```java import jxl.*; ``` 创建Excel文件的第一步是创建`Workbook`对象,可以使用`Workbook.createWorkbook()`...

    jxl.jar excel操作包

    首先,需要将jxl.jar添加到项目类路径中,然后就可以通过其提供的API来实现各种功能。例如,可以创建一个新的工作簿,添加工作表,设置单元格的值,甚至可以处理公式和图表。对于读取操作,jxl.jar同样提供了方便的...

    jxl.jar_java操作excel表格的jar包

    2. **读取Excel文件**:`jxl.read.biff.Biff8Reader`是读取Excel文件的核心类。以下是一个简单的例子,展示如何读取Excel工作簿中的第一个工作表: ```java import jxl.Sheet; import jxl.Workbook; public class ...

    使用jxl.jar在Android中操作Excel表格

    这里我们将深入探讨如何使用jxl.jar库在Android环境中操作Excel表格,特别是处理隐藏表的情况。 首先,jxl是一个Java库,它允许我们以编程方式读取和写入Microsoft Excel文件。由于Android系统基于Java,因此可以...

    jxl.jar源码

    源码中,这些功能主要集中在`jxl.read.biff`和`jxl.write.biff`两个包中。BIFF(Binary Interchange File Format)是Excel早期版本的数据存储格式,而OpenXML是微软从2007版开始引入的新格式。 在读取Excel文件时,...

    java中导出Execl所需jxl依赖包

    jxl导出excel必须的Jar包 import jxl.Workbook; import jxl.format.Alignment; import jxl.format.VerticalAlignment; import jxl.write.Label; import jxl.write....import jxl.write.biff.RowsExceededException;

    jxl.jar使用文档

    jxl.jar 通过java操作excel表格的工具类库 支持Excel 95-2000的所有版本 生成Excel 2000标准格式 支持字体、数字、日期操作 能够修饰单元格属性 支持图像和图表 应该说以上功能已经能够大致满足我们的需要。...

    jxl.jar和例子

    标题中的"jxl.jar和例子"表明了这个压缩包包含了一个名为"jxl.jar"的文件和相关的示例。这提示我们,这是一个关于使用Java处理Excel文件的资源包。jxl.jar是Java Excel API(JExcelApi)的一个版本,它是一个开源库...

    jxl.jar最新版本+使用说明+例子

    import jxl.read.biff.BiffException; import jxl.Workbook; import jxl.Sheet; import jxl.Cell; Workbook workbook = Workbook.getWorkbook(new File("input.xls")); Sheet sheet = workbook.getSheet(0); Cell ...

    使用jxl.jar 对Excel 进行读写

    import jxl.read.biff.BiffException; try { Workbook workbook = Workbook.getWorkbook(new File("yourfile.xls")); // ... } catch (BiffException | IOException e) { e.printStackTrace(); } ``` 2. 获取...

    Java对Excel的操作(附jxl.jar).rar

    import jxl.read.biff.BiffException; FileInputStream fis = new FileInputStream("path_to_your_file.xls"); Workbook workbook = Workbook.getWorkbook(fis); Sheet sheet = workbook.getSheet(0); // 获取第一...

    java的jxl.jar

    在Java项目中使用JXL.jar,首先需要将其添加到项目的类路径中。这可以通过将jar文件复制到项目的lib目录,或者在Maven或Gradle构建系统中声明依赖来实现。对于Maven,可以在pom.xml文件中添加如下依赖: ```xml ...

    jxl.jar包(2.6).zip

    jxl.jar是通过java操作excel表格的工具类库,开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的。

    jxl.rar_java添加jxl依赖_jxl_jxl.jar

    java实现数据的导入与导出依赖包 jxl.jar

    jmeter-Excel-jxl.zip

    jmeter在beanshell中创建Excel所需jar包-jxl.jar,有需要的伙伴欢迎可以下载,附脚本示例路径https://blog.csdn.net/m0_49009652/article/details/107690802

Global site tag (gtag.js) - Google Analytics