jxl.read.biff.SheetImpl.getCell의 ArrayIndexOutOfBoundsException 예외

5565 단어 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)을 호출할 때 반드시 수치 범위를 주의해야 한다.

좋은 웹페이지 즐겨찾기