2015-03-15 4 views
1
  • Excel File (test1.xlsx)
    Имя           Пол           Возраст           Resign Дата
    Али                             М                     Абу                         М                   Сити                           F                    апач пои indexoutofbound исключение

  • Код

    public class ReadExcel { 
    
    public static ArrayList<String> record; 
    
    public static void main(String[] args) throws FileNotFoundException, IOException { 
    
    //---Read file--- 
    FileInputStream in = new FileInputStream("test1.xlsx"); 
    XSSFWorkbook workbook = new XSSFWorkbook(in); 
    XSSFSheet spreadsheet = workbook.getSheetAt(0); 
    XSSFRow row; 
    Cell cell; 
    
    Iterator<Row> rowIterator = spreadsheet.iterator(); 
    
    while(rowIterator.hasNext()){ 
        record = new ArrayList<String>(); 
        row = (XSSFRow)rowIterator.next(); 
    
        if(row.getRowNum()==0) { 
         continue; 
        } 
    
        for(int k = 0; k < row.getLastCellNum();k++){ 
         cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK); 
        } 
    
        Iterator<Cell> cellIterator = row.cellIterator(); 
    
        while(cellIterator.hasNext()){ 
          cell = cellIterator.next(); 
          cell.setCellType(Cell.CELL_TYPE_STRING); 
    
          switch(cell.getCellType()){ 
           case Cell.CELL_TYPE_STRING: 
            record.add(cell.getStringCellValue()); 
            System.out.print(cell.getStringCellValue()); 
            break; 
           case Cell.CELL_TYPE_NUMERIC: 
            Double value = cell.getNumericCellValue(); 
            Long longValue = value.longValue(); 
    
            record.add(Double.toString(cell.getNumericCellValue())); 
            System.out.print(cell.getNumericCellValue()); 
            break; 
          } 
         } 
         System.out.println(); 
    
         String name = record.get(0); 
         String gender = record.get(1); 
         String age = record.get(2); 
         String dateLeave = record.get(3); //[ERROR] 
    
         System.out.println(name + gender + age + dateLeave); 
         } 
        } 
    } 
    

Однако, с моей вышеупомянутой программы, я получаю это исключение:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 
at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
at java.util.ArrayList.get(ArrayList.java:429) 
at ibguobform.ReadExcel.main(ReadExcel.java:66) 
Java Result: 1 

Что ошибки, которые я сделал?

+2

Вы отлажены это ? – Tdorno

ответ

3

Ваш код пытается сослаться на четвертый элемент из коллекции, которая имеет только три элемента:

record.get(3) 

Поскольку есть только три элемента, пытаясь ссылаться на четвёртую один выдает ошибку.

Почему существуют только три элемента?

Ну, посмотрите на данные:

Ali  M  20 
Abu  M  25 
Siti F  30 

Три элемента в строке.

То, что кажется, происходит это код динамически проверки последнего «элемента»:

for(int k = 0; k < row.getLastCellNum(); k++){ 
    cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK); 
} 

Казалось бы, что row.getLastCellNum() говорит код, что есть только три ячейки. (Потому что, ну, есть только три ячейки с данными в них.) Если четвертая ячейка действует даже тогда, когда нет никаких данных, явно отметить, что в коде всегда использовать четыре элемента:

for(int k = 0; k < 4; k++){ 
    cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK); 
} 
Смежные вопросы