jxl.read.biff.SheetImpl.getCell의 ArrayIndexOutOfBoundsException 예외
5565 단어 JXL
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)을 호출할 때 반드시 수치 범위를 주의해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Jxl Excel 파일 읽기 및 쓰기최근에 Excel 파일의 가져오기 내보내기를 사용하려고 합니다. Jxl과poi 두 가지 방식을 비교했습니다. Jxl은 상대적으로 간단하지만 xlsx 형식(2003 이전 버전)은 지원되지 않습니다. 다음은 Jxl의 데...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.