2017-01-04 5 views
0

Я читаю лист Excel с помощью Apache poi в java И я использую CellRangeAddress для получения региона.Лист Excel слияния ячейки с использованием apache poi в java

Case1: Если я даю 2-3 данных для слияния и перехода на следующую ячейку, тогда все в порядке. Я получаю следующий объединенный регион.

Вариант 2: Если я даю более 6 значений и собирается для следующего региона, то это показывает IndexOutofBoundException для объединенного региона

Вот код:

List<OrganizationDB> orgList = new ArrayList<OrganizationDB>(); 
    List<EmployeeDB> empList; 
    XSSFWorkbook workBook; 
    XSSFSheet excelSheet; 
    XSSFRow row; 
    XSSFCell cells; 
    TreeViewer treeViewer = null; 


    File excelFile = new File("D:\\ExcelExport\\ExcelSheet2.xls"); 
    FileInputStream fis; 
    if (excelFile.exists()) { 

     fis = new FileInputStream(excelFile); 

     workBook = new XSSFWorkbook(fis); 
     excelSheet = workBook.getSheetAt(0); 

     int count = 1; 


     while (count <= excelSheet.getLastRowNum()) { 


       CellRangeAddress region  = excelSheet.getMergedRegion(count); 
      row = excelSheet.getRow(count); 
      //XSSFCell cell = row.getCell(0); 

       orgDb = new OrganizationDB(); 

       orgDb.setOrganizationName(row.getCell(0) 
         .getStringCellValue()); 
       orgDb.setCityName(row.getCell(4).getStringCellValue()); 
       orgDb.setStateName(row.getCell(5).getStringCellValue()); 

       empList = new ArrayList<EmployeeDB>(); 

       while(count<=region.getLastRow()) 
       { 

          row = excelSheet.getRow(count); 
        empDb = new EmployeeDB(); 

        empDb.setCompanyName(row.getCell(0).getStringCellValue()); 
        empDb.setEmpID(row.getCell(1).getStringCellValue()); 
        empDb.setEmpName(row.getCell(2).getStringCellValue()); 
        empDb.setPhoneNo((int) row.getCell(3) 
          .getNumericCellValue()); 
        empList.add(empDb); 
        orgDb.setEmpList(empList); 
        count++; 
       } 
       orgList.add(orgDb); 
       } 

ответ

0

Я вижу логику в вашем коде , что я не совсем понимаю. Не могли бы вы это проверить? У вас есть счетчик count, используемый двумя вложенными циклами.

while (count <= excelSheet.getLastRowNum()) { 
      CellRangeAddress region  = excelSheet.getMergedRegion(count); 
... 
    while(count<=region.getLastRow()){ 
... 
     count++; 

, возможно, есть две слившиеся участки с рядами 1 до 3 и 4 до 6, то после первого запуска вашей верхней while вашего счетчика = 3, так как вложенные while увеличил его. Затем код пытается получить mergedRegion (3) и нет mergedRegion с индексом 3. Он должен быть mergedRegion (2) со следующим набором строк вместо ...

Я думаю, вы должны использовать различные счетчики для mergedRegions и rows в них.

Смежные вопросы